C# 处理顶级异常

C# 处理顶级异常,c#,exception,C#,Exception,捕获顶级异常是一种糟糕的做法,原因有很多。然而,有时开发人员并不关心操作是否失败 例如,有一种方法基于文件初始化变量,但变量已经具有有效值。开发人员可能不关心读取失败的原因 在这种情况下,捕获一般异常可能是有效的(可能是?),但系统异常除外(无内存、io错误等)。这是一个有效的模式吗 (请注意,该示例已根据@stuard注释进行了更新。) 如果用户不关心文件读取结果,那么您应该捕获IOException,而不是Exception 用户应该关注哪些错误: try { operation_whi

捕获顶级异常是一种糟糕的做法,原因有很多。然而,有时开发人员并不关心操作是否失败

例如,有一种方法基于文件初始化变量,但变量已经具有有效值。开发人员可能不关心读取失败的原因

在这种情况下,捕获一般异常可能是有效的(可能是?),但系统异常除外(无内存、io错误等)。这是一个有效的模式吗

(请注意,该示例已根据@stuard注释进行了更新。)


如果用户不关心文件读取结果,那么您应该捕获
IOException
,而不是
Exception
用户应该关注哪些错误:

try {
  operation_which_can_fail(); 
}
catch (IOException) {
  // We don't care about files, reading, permissions etc. 
  // Since "...variables already have valid values..." we can ignore the problem
}      
catch (Exception) {
  // Write some log : we have some unexpected problem
  ...     
  // rethrow exception : we don't want to swallow unknown problem warning  
  throw;  
} 

捕获一个异常,然后只是重新引用它是没有意义的。如果用户对文件读取不感兴趣,您可以捕获
IOException
,但不能捕获
exception
,这是用户应该关心的问题about@stuartd很好,在绘制过程中忘记了下一行会抓住它。我们将修改这个问题。这肯定是一个解决方案,但是,开发人员必须了解
IOException
。但是
NullReferenceException
呢?或任何其他非系统异常?我的目标是避免使用正常的异常处理逻辑(我在大多数情况下都会使用这种逻辑),而是处理最高级别的错误。但答案可能是,这样做是不可能的。
try {
  operation_which_can_fail(); 
}
catch (IOException) {
  // We don't care about files, reading, permissions etc. 
  // Since "...variables already have valid values..." we can ignore the problem
}      
catch (Exception) {
  // Write some log : we have some unexpected problem
  ...     
  // rethrow exception : we don't want to swallow unknown problem warning  
  throw;  
}