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