Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 自定义错误处理程序和Try-Catch-如何干净地处理错误和警告_Php_Error Handling_Try Catch - Fatal编程技术网

Php 自定义错误处理程序和Try-Catch-如何干净地处理错误和警告

Php 自定义错误处理程序和Try-Catch-如何干净地处理错误和警告,php,error-handling,try-catch,Php,Error Handling,Try Catch,我试图更好地理解异常处理。我有一个自定义错误处理程序。如果在邮件服务器不存在的情况下运行以下函数,它将正确地触发错误处理程序并返回“Ough Luck”。在错误处理程序中,我必须抛出newerrorexception(),以便激活try/catch。如果没有此语句,错误发生后,程序将继续执行下一行代码(在本例中返回“Feedback left”) 能够继续执行下一行代码非常有用,因为用户不会收到刺耳的错误消息和警告。但是,我希望能够在选定的情况下使用Try/Catch 如果用户看不到错误,但我可

我试图更好地理解异常处理。我有一个自定义错误处理程序。如果在邮件服务器不存在的情况下运行以下函数,它将正确地触发错误处理程序并返回“Ough Luck”。在错误处理程序中,我必须
抛出newerrorexception()
,以便激活
try/catch
。如果没有此语句,错误发生后,程序将继续执行下一行代码(在本例中返回“Feedback left”)

能够继续执行下一行代码非常有用,因为用户不会收到刺耳的错误消息和警告。但是,我希望能够在选定的情况下使用Try/Catch

如果用户看不到错误,但我可以使用try/catch,那么处理错误的更好方法是什么?有没有一种方法可以抛出新的ErrorException(使用$e->getSeverity()?),如果存在try/catch,则会对其进行处理,如果没有,则会忽略异常

set_error_handler('exceptions_error_handler');
error_reporting(E_ALL ^ E_STRICT);

echo feedback();

function feedback(){
    try{
        mail("m@localhost","subject","body","From: me");
        return "Feedback left.";
    }
    catch(Exception $e){
        error_log("Error sending feedback email." . "Some Custom Info For Error Log");
        return "Tough Luck";
    }
}


function exceptions_error_handler( $errno, $errmsg, $errfile, $errline, $context = null ){
    // custom log file handling
    log_exception( new ErrorException( $errmsg, 0, $errno, $errfile, $errline) );

    // required in order for the try/catch to be activated
    throw new ErrorException($errmsg, 0, $errno, $errfile, $errline);
}
根据定义,异常(或其任何子类)如果未被捕获,将停止程序执行。您可能想做的是
设置异常处理程序()
,以便能够处理代码中可能出现的任何未捕获的异常

更一般地说,您需要决定处理异常和错误的策略。对于大多数人来说,当应用程序进入意外状态(例如没有邮件服务器、失去数据库连接等)时,会引发异常。错误可能会导致您进入这种状态,或者在您进入这种状态时被触发,但不一定会导致您潜在地更改应用程序的行为方式(如提前终止请求)

例如,对于你的情况,我可能会考虑这样的事情:

try {
   echo feedback();
} catch(Exception $e) {
   echo 'Feedback failed with exception: ' . $e->message;
}

function feedback() {
   $success = mail(...);
   if (false === $success) {
        $error_info = error_get_last();
        throw new Exception('Mail failed with error: ' . $error_info['message']);
   } else {
       return 'Feedback Left';
   }
}
通常,您可能会围绕类方法调用的单个函数包装try-catch块,而不是尝试在函数本身中创建try-catch块。因此,本质上,您正在尝试调用反馈函数,并且您正在捕获在调用过程中可能引发的任何异常

在编写良好的代码中,您可能会看到
在大多数函数/方法代码块的开头附近抛出
,以验证输入,因为输入无效将表明应用程序处于意外状态。比如:

public function set_foo($bar = NULL) {
    if(is_null($bar)) {
        throw new Exception('A value must be passed for $bar');
    }

    // perform method logic
}

在抛出表达式的方法/函数中,“提前退出”通常是一种好的做法。换句话说,在可能的情况下,检查所有依赖项,并在代码块的开头抛出适当的异常,然后再执行可能执行更改应用程序状态等操作的逻辑。以这种方式将异常逻辑提前分组,这对代码可读性也有很大帮助。

Wow。我很难为情地说,我从来没有意识到除了设置错误处理程序之外,还有一个设置异常处理程序()。我很难从文件中看出这会有什么不同。我感谢您对try/catch用法的澄清。在我如何使用它的概念中,我似乎已经将功能倒退了。但是在您的示例中,mail()在测试
if(false===$success)
之前不会抛出异常吗?我的异常处理程序将如何处理它?它通常不会抛出异常吗?如果我的异常\u错误\u处理程序没有抛出新的异常,我看到这将允许我在测试的函数中逐个抛出我自己的异常,如果我像您所示编写代码的话。正确吗?@mseifert
mail()
不应单独引发异常。即使是这样,它也会被调用
feedback()
时的try-catch块捕获。老实说,我不知道为什么您会像现在这样使用
异常\u错误处理程序()
,对我来说,从本质上讲,将所有错误更改为异常并不是一种好的编码实践。在代码中任何地方,如果您感觉到您的预期用例通常不会产生异常,您应该可以随意抛出异常。@MSeifer这是一个围绕使用自定义异常类型的额外策略级别(例如,为了能够向调用客户端传递异常本质上是暂时的,请求应该失效,执行自定义日志记录行为,等等)。但在真正深入研究这些之前,您可能应该熟悉基本的异常处理。关于为什么将所有错误更改为异常:我实际上不
抛出新的ErrorException()
使用自定义errorhandler,尽管我已经多次看到过以这种方式发布的代码。我使用异常处理程序记录所有错误和警告,以便调试代码并跟踪运行时问题。我刚刚才意识到
抛出新的ErrorException()
和try/catch之间的关系。您的回答应该能让我理解。