我正在用c#编写一个登录类,我正在努力为空密码,密码不足的密码字符等抛出异常。突然发生的事情是 - 我怎么处理这些异常?他们是谁/他们是谁?无论我是否处理异常,该应用程序仍然会失败。是其他开发者的例外,客户!?
答案 0 :(得分:6)
如果您是创建异常的人,则不应对其进行任何操作。
例外情况是让您的消费者知道您无法正常恢复的错误。你给他们机会来纠正问题,记录错误,或者将异常传递到链上,直到可以用它做一些有用的事情。
答案 1 :(得分:6)
例外用于提供有关特定故障原因的详细信息。如果您只是让代码本身失败,您就错过了提供有关失败的实际原因的更详细信息的机会。
您的用户不应该看到您添加到例外的信息。相反,请考虑添加一个全局异常处理程序,捕获您的详细异常,记录信息,然后向您的用户显示友好的错误消息。
异常不仅在日志中提供有关失败原因的详细消息(即示例中的密码为空),还提供了指示导致异常的调用链的调用堆栈信息。在登录表单中,这不太重要。但是,在多线程异步客户端/服务器应用程序中,这可能很关键。
本文包含许多好的指南:http://msdn.microsoft.com/en-us/library/ms229005.aspx
答案 2 :(得分:3)
向下一级抽象信号表明存在问题,并改变其逻辑流程以解决问题。
答案 3 :(得分:3)
异常本身恰好可以防止将来出现更大的问题。如果你只是默默地做了什么,当你知道发生了不应该发生的事情时,调用你的代码的程序可能会假设用户的文件在它确实没有时被保存,这显然比它能够告诉用户,“我无法保存您的文件。”
您为异常提供的消息是针对其他开发人员的。如果程序在开发过程中崩溃,开发人员应该能够看到堆栈跟踪并更容易找出发生了不应该发生的事情的原因。理想情况下,您将能够以开发人员甚至在生产中查看错误的方式记录错误。
答案 4 :(得分:2)
例外通常表明该方法的合同已被违反。该方法的客户端关心异常并应适当地处理它们。当违反合同时,方法本身通常无法恢复,也无法产生有意义的结果。例外情况表明没有任何有意义的结果。
答案 5 :(得分:1)
简而言之,重点是表明确实发生了不应该发生的事情。
答案 6 :(得分:0)
例外是代码通知调用者某种失败的方法。调用代码可以随意执行任何操作,例如显示错误消息,抑制异常并优雅地降级等等。
答案 7 :(得分:0)
展示他们(客户)做坏事的优雅方式。
答案 8 :(得分:0)
因此。你写了一个很棒的节目。该程序有一个可能的失败点。如果无论出于何种原因程序部分失败,你可能仍然希望继续执行程序的其余部分,并且要么明确注意失败,记录它,要么继续前进。
我将使用伪代码语法,但您应该能够遵循它:
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;
}
答案 9 :(得分:0)
如果你的函数在无法登录的情况下会抛出异常,那么调用你的函数的代码可以假设如果你的函数返回,它就会登录。这将减轻代码处理的工作量“登录成功”方案,以换取“登录失败”方案中需要更多工作。如果有时会在半预期失败的情况下使用代码(例如尝试使用一组凭据登录;如果这不起作用,请尝试其他一组),有时在故障意外且不可恢复时使用,有时可能会使用有帮助有一个“throw on error”布尔标志,或者有单独的“Login”和“TryLogin”方法。
答案 10 :(得分:-3)
例外的本质是必须明确忽略它们。假设你有这个功能:
bool authenticate ( String username, String password )
{
if ( invalid_password(password) ) {
return (false);
}
// ... perform authentication ...
}
现在,请考虑这是某个服务器的一部分,并且服务器在高权限上下文中运行。如果调用代码(执行授权的代码)在其逻辑中有一些错误,则可能无意中允许用户执行通常不允许的操作。
我会写下面的函数:
void authenticate ( String username, String password )
{
if ( invalid_password(password) ) {
throw new LoginFailed();
}
// ... perform authentication ...
}
请注意,这纯粹是一种防御性的编程方法,在这种情况下,这是我的偏好。这样,登录错误很可能不允许操作继续执行。