如何管理特定和一般异常

时间:2017-09-06 09:12:18

标签: c# .net exception exception-handling

如果这里的OracleException不是我想要的,会发生什么?我需要扔吗?在这里捕捉一般的例外是正确的事情吗?

try
{
    does some code
}
catch (OracleException ex)
{
    if (ex.Number == 20001)
    {
        throw new ValidationException("Unable blah blah blah");
    }
    throw;
}
catch (Exception ex)
{
    // Log it
    TraceHelper.WriteLine("Exception updating tblah + Environment.NewLine + ex.StackTrace, MessageCategory.Error);
    throw;
}

2 个答案:

答案 0 :(得分:1)

真正好的做法是在代码中出现错误时意识到这一点。你是怎样做的?通常崩溃或放置一个全局异常处理程序来捕获异常并以某种方式通知开发人员。

捕获一般异常并且不抛弃它违反了之前的声明,因此建议不要这样做。

快速失败通常被认为是一种好习惯(here a description

最后但不租赁你通常不想捕捉到你不知道如何从中恢复的异常。如果你有bug并且你有一个ArgumentNullException,你会在你的应用程序中做什么?在您的代码中无法从这种情况中恢复,您必须失败,通知de用户和开发人员并结束应用程序。

答案 1 :(得分:1)

这看起来只是想根据该异常的某些条件捕获OracleException。好消息是,使用 C#6.0 ,您可以添加when子句来添加该条件:

catch (OracleException ex) when (ex.Number == 20001) 
{ 
    throw new ValidationException("Unable blah blah blah");
}

这意味着如果ex.Number不是20001,抛出的异常将检查您拥有的下一个catch子句,在这种情况下,它将落入您的泛型catch中。

通用捕获是否应该存在争议,作为 通用 经验法则,您不应该进行通用异常处理。如果你不知道为什么代码会抛出异常,你怎么能期望成功处理它?<​​/ p>