划分PHP错误和应用程序错误

时间:2011-03-01 08:52:24

标签: php error-handling try-catch

我正在处理一个应用程序并且发生了一个问题。我想将PHP错误放在一边(他们将登录数据库或文件中)并管理其他错误(例如“您的用户名无效”或“您键入了错误的密码”或“图像不能使用如此着名的try-catch方法加载“)。仅使用try-catch完全管理此类错误是否合适?

5 个答案:

答案 0 :(得分:3)

异常的主要优点是它是“petite mort”的行为,die()内部try{}块,阻止执行更多代码。

虽然它在处理应用程序错误方面非常方便,但在处理验证用户输入时却变得不那么好了。如果用户填写表格时犯了3个错误,那么一次性显示所有错误将是仁慈的,而不是一个接一个地显示。

您更需要POST / Redirect / GET模式来处理用户错误:

<?  
if ($_SERVER['REQUEST_METHOD']=='POST') {  

  $err = array();
  //performing all validations and raising corresponding errors
  if (empty($_POST['name']) $err[] = "Username field is required";  
  if (empty($_POST['text']) $err[] = "Comments field is required";  

  if (!$err) {  
    //if no errors - saving data and redirect
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
  }  else {
    // all field values should be escaped according to HTML standard
    foreach ($_POST as $key => $val) {
      $form[$key] = htmlspecialchars($val);
    }
} else {
  $form['name'] = $form['comments'] = '';  
}
include 'form.tpl.php';
?>  

答案 1 :(得分:1)

我认为:它不是,因为这不是错误或异常,而只是无效的输入。它们也很常见,在这种情况下,这个词的含义并不例外。

另一方面,因为每个异常都会破坏当前的执行,所以当某些代码没有执行时,可能会导致意外的行为,因为有人输入了一个未知的用户名或其他内容。如果出现错误或异常,您通常希望停止执行,因为您认为执行不合理(直到您捕获异常并继续)。

答案 2 :(得分:1)

对于最终用户错误,您应该引入单独的应用程序级别处理系统。

异常对于处理错误条件(生产中出现的错误)很有用,而自定义E_USER_错误最适合发送数据/调试/安全问题(在开发阶段应该处理的任何事情)。

答案 3 :(得分:0)

我使用我编写的自定义Log类,并将其设置为默认错误处理程序和异常处理程序,以及提供“debug”,“info”,“warning”,“success”和“deprecated”方法手动记录(和可选地显示)消息。

奖金是,它显示当发生实际错误时当前范围内的变量转储,而不是仅告诉您它发生的位置。

答案 4 :(得分:0)

错误和例外是技术问题,而验证是商业问题。 IF处理Business,TRY / CATCH处理他们不混合的技术内容,你不应该混合它们。有时你必须使用if抛出异常(PHP的东西),但这是框架/架构级别的必要性,例如

if(database_error_handle_raises_error()) {
     throw new MyDatabaseException(driver_raised_error);
}
通过这种方式,您可以更好地控制错误。但规则仍然存在: 尝试/抓住/投掷=技术 如果/ Else Switch = business