你会怎么做这样的事情?
#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
}
还有其他想法吗?
答案 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)
GoTo
是Considered 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的大惊小怪 为什么仅仅因为一些奇怪的迷信而增加了大量无用的操作员?
如果您的条件相互依赖,那么请转到。
如果可以全部检查它们,就像在表单验证中一样 - 只需依次检查它们。
异常也可以,但当然不是一般的系统错误,而是特别设计的异常,不会干扰他人。
但让我感到兴奋的是对这两个运营商的不同态度 - throw
和goto
。虽然后者永远被定罪为最严重的罪行,但前者同时被视为圣杯。
虽然两者完全相同(%)