PHP错误检查

时间:2011-09-09 17:37:43

标签: php

你会怎么做这样的事情?

#do something that may cause an $error
if (!$error) {
    #do something that may cause an $error
    if (!$error) {
        #do something that may cause an $error
        if (!$error) {
            #do something that may cause an $error
            if (!$error) {
            }
        }
    }

}

if ($error) {
    #error message
}

我认为这是一个更好的解决方案:

#do something that may cause an $error
if ($error) goto error;
#do something that may cause an $error
if ($error) goto error;
#do something that may cause an $error
if ($error) goto error;
#do something that may cause an $error
if ($error) goto error;

error:
if ($error) {
    #error message
}

还有其他想法吗?

5 个答案:

答案 0 :(得分:1)

if ($error){
   trigger_error('Your error', E_USER_ERROR);
}
#something
if ($error){
   trigger_error('Your error', E_USER_ERROR);
}

答案 1 :(得分:1)

我不会。我构建我的脚本以使用一些逻辑上的try / catch块,这样我就可以处理错误,而不必诉诸于大量的if语句......并且得到...(你知道我的大学教授会给你一个F并踢你出去如果你在任何脚本/代码项目上放置GOTO语句,你的类是什么?)

从方便的:http://php.net/manual/en/language.exceptions.php

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Hello World';
?>

对于你的例子:

#Do something
try
{
   #code for doing something.
}
catch(Exception $ex)
{
  throw new Exception("error doing something", $ex);
}

#do something again, and again. this will only happen if the previous worked.
try
{
     #Ok let's try this again.
}
catch(Exception $ex)
{
  throw new Exception("Again!?", $ex);
}

如果抛出异常 - 它应该/需要/请被另一个catch捕获,否则它将在整个用户中吐出错误。

答案 2 :(得分:1)

do..while(false)and break:

do {

    #do something that may cause an $error
    if ($error) break;

    #do something that may cause an $error
    if ($error) break;

    #do something that may cause an $error
    if ($error) break;

    #do something that may cause an $error
    if ($error) break;

} while (false);

if ($error) {
    # handle error
}

这实际上是PHP手册的一个例子:http://docs.php.net/manual/en/control-structures.do.while.php

答案 3 :(得分:0)

GoToConsidered Harmful(对不起,老笑话) - 但大部分时间都不需要。有更灵活的方法来处理错误,但这在很大程度上取决于上下文。

作为示例,您提供的嵌套if语句没有“错误”,但如果每个块都很长,很容易错误地读取大括号,因此很难维护。

你可以把它展开:

$error = false;

/* do something that might set $error to true */

if ($error === false) {
  /* continue the process, might set error to non-false (tip: pass an error message!) */
}
if ($error === false) {
  /* continue the process, might set error to non-false  */
}
if ($error === false) {
  /* continue the process, might set error to non-false  */
}
if ($error === false) {
  /* continue the process, might set error to non-false  */
}
if ($error !== false) {
  /* generic error handling (report to the user, etc) */
  echo 'There was an error: '.$error;
  die();
}

/* report success to the user */

我不会对$error使用true / false,而是在没有错误时使用false,或者描述错误的短消息。这将使调试更容易,您可以为用户提供有用的信息。

此外,在不知道你在做什么的情况下,我会说这似乎是一种处理错误的笨重方式。在没有看到上下文的情况下,我无法肯定地说,但似乎如果脚本的上半部分遇到错误,您可能不想打扰脚本的其余部分。也许更好,然后:

$error = false;
/* do something that might set $error to true */
if ($error !== false) return errorHandler($error);
// ... etc

或者可能使用异常处理程序:

$error = false;
/* do something that might set $error to true */
if ($error !== false) throw new Exception($error);
// ... etc

正如你所看到的,有不止一种方法可以给这只猫上皮。它确实非常依赖于上下文,无论是在特定的功能或过程中,还是在整个项目中。一个项目具有一致的错误处理是至关重要的,因此开发可重用的东西是值得的。第一个路径,嵌套ifs块(或大型系列中的ifs)有一个欠发达的错误处理系统的标记 - 它不会让我觉得非常系统或灵活。

答案 4 :(得分:0)

我不明白所有关于goto的大惊小怪 为什么仅仅因为一些奇怪的迷信而增加了大量无用的操作员?

如果您的条件相互依赖,那么请转到。

如果可以全部检查它们,就像在表单验证中一样 - 只需依次检查它们。

异常也可以,但当然不是一般的系统错误,而是特别设计的异常,不会干扰他人。

但让我感到兴奋的是对这两个运营商的不同态度 - throwgoto。虽然后者永远被定罪为最严重的罪行,但前者同时被视为圣杯。

虽然两者完全相同(%)