我正在用C#编写一个登录类,并且试图在空密码、密码字符不足等情况下认真地抛出异常。突然想到的问题是,我应该如何处理这些异常?它们是为了什么或谁而存在的?无论我是否处理异常,应用程序都将在那一点失败。异常是为其他开发人员还是客户端设计的呢?
如果是您自己创建的异常,那么您不应该对其进行任何操作。
异常是您向使用者传达某些无法恢复的错误信息的方式。您可以让使用者有机会纠正问题、记录错误或将异常传递到更高层级,直到有用的操作可以执行为止。
异常用于提供有关特定故障原因的详细信息。如果您仅让代码自己失败,您将错失提供有关故障实际原因更丰富细节的机会。
您的用户不应该看到您添加到异常中的信息。相反,考虑添加一个全局异常处理程序,捕获您的详细异常,记录信息,然后向用户显示友好的错误消息。
异常不仅在日志中提供有关故障原因的详细信息(例如,在您的示例中密码为空),还提供调用堆栈信息,指示导致异常的调用链。在登录表单中,这不那么重要。但是,在多线程异步客户端/服务器应用程序中,这可能是至关重要的。
本文包含许多良好的准则:http://msdn.microsoft.com/en-us/library/ms229005.aspx
向更高一级的抽象层发出信号,表明存在问题,并改变其逻辑流以解决问题。
On Error Resume Next
... 一想到它,我就不寒而栗。有些错误的症状让我必须修复,这些错误距离引起错误的源头相差甚远,就像在现实世界中走了数英里的距离一样。 - ChaosPandion异常通常表示方法的约定已被违反。该方法的客户端关心此异常并应适当处理。当约定被违反时,该方法本身通常无法恢复并且无法产生有意义的结果。异常表明没有有意义的结果即将来临。
false
也不是错误的。 - STW所以,你写了一个很棒的程序。这个程序有一个可能的失败点。如果由于任何原因程序的某个部分失败了,你可能仍然希望继续运行程序的其余部分,并且要么显式地指出失败,记录它,或者只是继续运行。
我将使用伪代码语法,但你应该能够理解:
var pw=$_POST['pw'];
var un=$_POST['un'];
try{
$sql="select lastlogin,access from users where un=q(/'$un'/) and pw= q(/'md5($pw)'/)";
$user=$db->getRow($sql);
if(!$user) {
//they don't exist
}else{
//process their login
}
}catch(Exception $e){
//we has a Database error. either my query s really screwed up or the DB is down. let's log it and exit this stream; service
$mylogger->log("Error while logging in using module $MODULENAME$ ".implode("<br/>",(array)$e));
exit;
}
异常是代码通知调用者某种失败的一种方式。调用代码可以根据需要进行处理,例如显示错误消息、抑制异常并优雅地降级等。