在网站中依赖 die() 进行错误处理是一个糟糕的设计,因为它会导致网站用户体验糟糕:页面损坏,而且 - 如果他们幸运的话 - 会显示对他们毫无帮助的错误信息。就他们而言,当页面出现故障时,整个网站都可能无法使用。
如果您希望公众使用您的网站,请始终设计它以一种允许用户在可能的情况下继续使用它的方式处理错误。如果不可能,并且网站真的坏了,请确保您能发现问题,以便可以修复它。仅凭 die() 无法做到这两点。
如果超市的冷冻柜坏了,想要购买一盒冰淇淋的顾客不会期望被赶出店外。
(PHP 4、PHP 5、PHP 7、PHP 8)
die — 等效于 exit
此语言结构等效于 exit().
在网站中依赖 die() 进行错误处理是一个糟糕的设计,因为它会导致网站用户体验糟糕:页面损坏,而且 - 如果他们幸运的话 - 会显示对他们毫无帮助的错误信息。就他们而言,当页面出现故障时,整个网站都可能无法使用。
如果您希望公众使用您的网站,请始终设计它以一种允许用户在可能的情况下继续使用它的方式处理错误。如果不可能,并且网站真的坏了,请确保您能发现问题,以便可以修复它。仅凭 die() 无法做到这两点。
如果超市的冷冻柜坏了,想要购买一盒冰淇淋的顾客不会期望被赶出店外。
请注意,在命令行上使用 PHP 时,die("Error") 只是将“Error”打印到 STDOUT 并使用正常的退出代码 0 终止程序。
如果您希望遵循 CLI 程序的 UNIX 约定,您可以考虑以下方法
<?php
fwrite(STDERR, "An error occurred.\n");
exit(1); // 非 0 的响应代码表示失败
?>
这样,当您将 STDOUT 管道到文件时,您可能会在控制台中看到错误信息,而 BASH 脚本可以测试 0 的响应代码以确定成功
rc@adl-dev-01:~$ php die.php > test
An error occurred.
rc@adl-dev-01:~$ echo $?
1
理想情况下,PHP 会将所有警告、致命错误等写入 STDERR,但这又是另一个故事了。
"... OR DIE..."
<?php
do_something($with_this) or die ('oops!');
?>
(在 php 中,“die”实际上是“exit”的别名)
请注意,这通常用作错误处理语句,实际上并非如此... 只是“or”布尔运算符被重载了(短路)
它不会抑制任何错误信息,不会阻止致命错误或崩溃,它不是“try/catch”的别名,并且可能会产生不可预测的结果... 它就像这样
- 通常执行第一个语句 ""do_something($with_this)""
-- 如果语句结果为 TRUE:不需要执行第二个语句,因此跳过它
-- 否则如果返回 FALSE... 我不确定整个表达式的结果,所以继续执行第二个语句 ""die('cuack!)""
所以您不能依赖所有语句来抑制错误信息或崩溃,或者始终在错误或不希望的行为上返回“false”...
为此,最好使用错误跳过运算符“@”、“if”和“exit”命令,或者使用“try/catch”块
我一直想知道为什么重复的命令应该存在,但 die 是其中之一,我知道原因。它可能与 exit() 相同,但当您想在源代码中搜索 die() 以查找未处理的错误与干净的退出时,这在调试方面有所帮助。更不用说向后兼容性了,但我们出于“良好”的理由弃用了这些理由。