如果无法访问Web上的内容(api,数据库),我将如何停止执行脚本的其余部分并将错误记录在日志文件中?嗯,所以访问者不会看到确切的原因,而是他们会看到我的自定义消息(例如,'一件坏事刚刚发生')。我需要采取哪些步骤来安排事情?
答案 0 :(得分:11)
在这种情况下,我通常喜欢使用Exceptions:它允许我在一个地方拥有所有错误处理代码。
例如,我会使用类似这样的东西:
try {
// Some code
// Some code that throws an exception
// Some other code -- will not be executed when there's been an Exception
} catch (Exception $e) {
// Log the technical error to file / database
// Display a nice error message
}
这样,所有错误处理代码都在catch
块中 - 而不是在我的整个应用程序中分散。
但请注意,许多PHP函数不会抛出异常,只会引发警告或错误......
对于那些,您可以使用set_error_handler
来定义自己的错误处理程序 - 这可能会抛出异常;-)
例如,请参阅manual page of ErrorException
上的示例。
虽然这对许多错误/警告都有效,但您应该注意它不适用于Parse Error
或Fatal Error
:
我绝不会在代码中间放置任何die
和exit
:在我看来,这是处理错误的最糟糕方式之一。
我还要配置我的服务器/应用程序:
display_errors
设置为Off
。log_errors
和error_log
将错误记录到文件中。答案 1 :(得分:3)
所以访客不会看到 确切的原因,但他们会 看我的自定义消息
我建议你在 custom error handling in PHP 上阅读David Walsh撰写的这篇优秀文章。
您可以使用 set_error_handler() 功能。
我将如何停止执行其余的 脚本并记录错误 日志文件?
PHP有一个默认函数来记录错误;的 error_log 强>
来自PHP.net的示例:
<?php
// Send notification through the server log if we can not
// connect to the database.
if (!Ora_Logon($username, $password)) {
error_log("Oracle database not available!", 0);
exit; //exit
}
// Notify administrator by email if we run out of FOO
if (!($foo = allocate_new_foo())) {
error_log("Big trouble, we're all out of FOOs!", 1,
"operator@example.com");
}
// another way to call error_log():
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
?>
更多资源:
<强> This is also good article covering most of it related to error handling. 强>