C# - 围绕抛出自定义异常或处理案例构建逻辑是否更好?

时间:2013-06-13 21:18:09

标签: c# exception try-catch handle

如果我想构建我的业务逻辑,通过抛出自定义异常或添加特定的“If”条件以避免特定情况来处理逻辑是否更好?

例如(愚蠢但很简单的例子):

var success = true;
try{

   if(value == 5){
      throw new CustomException("Invalid Value!");
   }

   DoStuffIfValueIsValid();

}catch(CustomException e){
   success = false;  
}

return success;

VS

var success = true;    

if(value == 5){
   success = false;
} else {
   DoStuffIfValueIsValid();
}
return success;

我知道这个例子看起来很愚蠢,但是在大量具有更多逻辑的代码中,我应该使用更多条件来避免使用多个try catch吗?

提前致谢!

3 个答案:

答案 0 :(得分:3)

简单地说,我建议不要使用异常来控制程序的流程。当没有其他选项可以解决问题时,您应该引发异常,而不是仅仅为了返回结果或其他选项而跳转到程序的特定点。例外情况仅适用于“特殊”或意外情况。这样做有点像写goto。除此之外,它们是昂贵的物体,可能对性能产生重大影响。请参阅“.NET Framework性能规则”一书中有关MSDN“Avoid using exceptions for control flow”的文章。

答案 1 :(得分:1)

这两种方式都是有效的,它实际上取决于代码负责的其他方式。

首先,当它是例外时,没有合理的方法可以继续。虽然给出了您的示例,但您通常不会在1个方法中抛出并捕获自己的异常。通常你需要它,这样你就可以将调用链解除到可以处理失败的程度。

第二种方式(如果可以的话,这应该是你的第一个选择)是,如果你能在逻辑上处理错误条件,那就这样做。

此外,第二个选项通常被视为“保护条款”

通常写成: -

if(value == 5) return false;
DoStuffIfValueIsValid();

答案 2 :(得分:0)

如果你无法在检测到它时处理它,你应该尝试只抛出异常

try
{
  // some stuff 
  if (condition)
  {
     throw new MyException("ooher");
  }
}
catch (MyException mex)
{
   // undo some stuff
   throw;
}