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

C#-围绕抛出自定义异常或处理案例构建逻辑更好吗?,c#,exception,try-catch,handle,C#,Exception,Try Catch,Handle,如果我想构建我的业务逻辑,那么通过抛出自定义异常或添加特定的“如果”条件来避免特定情况来处理逻辑是更好的做法吗 例如(愚蠢但简单的例子来说明问题): VS 我知道这个例子看起来很愚蠢,但是在一个包含更多逻辑的大规模代码中,我应该使用更多的条件来避免使用多个try-catch吗 提前谢谢 简单地说,我建议不要使用异常来控制程序流。当没有其他选项来解决问题时,您应该引发异常,而不是跳转到程序的某个特定点,只是为了返回一个或另一个结果。例外情况是为“例外”或意外情况保留的。这样做有点像编写一个goto

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

例如(愚蠢但简单的例子来说明问题):

VS

我知道这个例子看起来很愚蠢,但是在一个包含更多逻辑的大规模代码中,我应该使用更多的条件来避免使用多个try-catch吗


提前谢谢

简单地说,我建议不要使用异常来控制程序流。当没有其他选项来解决问题时,您应该引发异常,而不是跳转到程序的某个特定点,只是为了返回一个或另一个结果。例外情况是为“例外”或意外情况保留的。这样做有点像编写一个
goto
。除此之外,它们是昂贵的对象,可能会对性能产生重大影响。请参阅NET Framework性能规则手册中有关MSDN“”的这篇文章。

简单地说,我建议不要使用异常来控制程序流。当没有其他选项来解决问题时,您应该引发异常,而不是跳转到程序的某个特定点,只是为了返回一个或另一个结果。例外情况是为“例外”或意外情况保留的。这样做有点像编写一个
goto
。除此之外,它们是昂贵的对象,可能会对性能产生重大影响。请参阅NET Framework性能规则手册中有关MSDN“”的这篇文章。

这两种方法都是有效的,这实际上取决于该代码还负责什么

第一个是当它是例外的时候,就没有合乎逻辑的方式继续下去。尽管给出了您的示例,您通常不会在1方法中抛出并捕获自己的异常。通常情况下,您需要它,这样您就可以将呼叫链展开到可以处理故障的位置

第二种方法(如果可以的话,这应该是您的第一个选择)是,如果您可以逻辑地处理错误条件,那么就这样做

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

通常是这样写的:-

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

这两种方法都是有效的,这实际上取决于代码还负责什么

第一个是当它是例外的时候,就没有合乎逻辑的方式继续下去。尽管给出了您的示例,您通常不会在1方法中抛出并捕获自己的异常。通常情况下,您需要它,这样您就可以将呼叫链展开到可以处理故障的位置

第二种方法(如果可以的话,这应该是您的第一个选择)是,如果您可以逻辑地处理错误条件,那么就这样做

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

通常是这样写的:-

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

只有在检测到异常时无法处理异常时,才应尝试抛出异常

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

只有在检测到异常时无法处理异常时,才应尝试抛出异常

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

你为什么不立即返回
false
?在这个简单的代码中,是的,我同意,不简单地返回
false
,而是如果在
dostuffvalueisvalid()中返回该怎么办还有其他逻辑抛出
自定义异常
?问题更多的是在这个意义上:用异常抛出来控制逻辑是错误的吗?或者我应该完全改变逻辑来使用更多的if条件吗?那么我仍然会在您知道需要返回false的地方返回false。它清楚地表明了您试图实现的目标。为什么不立即返回
false
?在这个简单的代码中,是的,我同意,如果不简单地返回
false
,那将是愚蠢的,但是如果在
dostuffivvalueisvalid()中还有其他逻辑抛出
自定义异常
?问题更多的是在这个意义上:用异常抛出来控制逻辑是错误的吗?或者我应该完全改变逻辑来使用更多的if条件吗?那么我仍然会在您知道需要返回false的地方返回false。它清楚地表明了你想要达到的目标。谢谢你,说得好。这正是我不确定的谢谢你,说得好。这正是我不确定的