Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在方法中,只有契约。那么,这是否意味着异常通常在较低级别抛出,但应该以更高级别的方式进行管理,应用程序应该继续运行?@hoakey-如果您可以从异常中正常恢复,很可能它应该被记录在某个地方,但应用程序可以继续运行。有些异常无法恢复,导致应用程序停止。@Vi_C#_Exception Handling - Fatal编程技术网

C# 在方法中,只有契约。那么,这是否意味着异常通常在较低级别抛出,但应该以更高级别的方式进行管理,应用程序应该继续运行?@hoakey-如果您可以从异常中正常恢复,很可能它应该被记录在某个地方,但应用程序可以继续运行。有些异常无法恢复,导致应用程序停止。@Vi

C# 在方法中,只有契约。那么,这是否意味着异常通常在较低级别抛出,但应该以更高级别的方式进行管理,应用程序应该继续运行?@hoakey-如果您可以从异常中正常恢复,很可能它应该被记录在某个地方,但应用程序可以继续运行。有些异常无法恢复,导致应用程序停止。@Vi,c#,exception-handling,C#,Exception Handling,在方法中,只有契约。那么,这是否意味着异常通常在较低级别抛出,但应该以更高级别的方式进行管理,应用程序应该继续运行?@hoakey-如果您可以从异常中正常恢复,很可能它应该被记录在某个地方,但应用程序可以继续运行。有些异常无法恢复,导致应用程序停止。@Vincent:是的,我完全同意,但第一句话本身就很奇怪+1:这可能是我听过的关于异常处理的最合理的规则。然而,在登录上下文中存在与普通错误代码相关的安全问题。我经常在错误代码与异常的讨论中听到这一点,而且它从来没有,甚至一次,似乎是一个好的论据。


在方法中,只有契约。那么,这是否意味着异常通常在较低级别抛出,但应该以更高级别的方式进行管理,应用程序应该继续运行?@hoakey-如果您可以从异常中正常恢复,很可能它应该被记录在某个地方,但应用程序可以继续运行。有些异常无法恢复,导致应用程序停止。@Vincent:是的,我完全同意,但第一句话本身就很奇怪+1:这可能是我听过的关于异常处理的最合理的规则。然而,在登录上下文中存在与普通错误代码相关的安全问题。我经常在错误代码与异常的讨论中听到这一点,而且它从来没有,甚至一次,似乎是一个好的论据。“不应该发生”是一个有争议的问题。异常抛出和处理的成本很高——设计良好的系统将在执行可能产生异常的操作之前验证条件是否满足。这并不是说永远不应该发生异常,而是应该将异常保留在操作错误或出现意外情况的情况下。STW@在这种情况下,您可能不会对空密码抛出异常,因为这本身不是一个失败?@hoakey--该方法验证密码;因此,如果没有给出密码,您可以返回false(意味着“这无效”)或抛出ArgumentNullException(意味着“您没有给我密码进行验证”)。我倾向于后者;确保用户输入必填字段不是验证器的工作,因此抛出异常是完全可以的。然而,返回
false
也不会是错误的。@STW-我慢慢发现,在编程过程中,可能会花太多时间考虑其他方法,而没有继续编码工作……不得不更多地考虑这一点,而且这很难闻。虽然它很聪明,但它使这段代码更难被消费者接受。另一个开发人员如何知道该方法抛出异常而不是返回false(正如签名所暗示的那样)?在这种情况下,最好将该方法定义为
void authenticate()
——一个总是返回
true
(或抛出异常)的函数散发着代码气味。尝试身份验证时无效的凭据并不例外-我认为返回
LoginResult
或类似的结果对客户端来说会更清楚。@STW:这就是为什么他将第二个示例中的签名更改为
void
。不过,我同意Lee的观点,在编程术语中,无效密码并不是例外。它一直在发生,应该是你正常逻辑流程的一部分。但是,如果某个特定的方法在用户未通过身份验证之前不应该被调用,那么该方法应该有一个guard子句,如果用户未通过身份验证,该子句将引发异常。@André-我想说,异常情况是指既不能预料也不能防止(或两者兼而有之)的情况。打开一个不存在的文件是一个例外,因为如果不尝试,就无法知道它是否会成功。对违反合同的行为抛出异常是合理的,因为方法不能防止错误的参数。但是,在您的示例中,无效凭据并不是坏参数(因为前提条件是静态的),并且由于失败的登录很常见,所以它们是可以预期的。处理这个案例应该是应用程序正常控制流程的一部分。是的,我没有调试。。。我不确定我的q(/“”/)语法。我想你现在可以在oracle中这样做了,但似乎已经完全忘记了。我个人更喜欢下一步错误恢复时的
。。。我说这话都会不寒而栗。我必须修复一些bug的症状,这些症状在现实世界中相当于距离bug的发起者很远。@chaospandio:我的同情。快速失败是你的朋友。
  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;
    }
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 ...
}