如何管理特定和一般的异常

问题描述:

如果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; 
} 

一个非常好的事情就是在代码中发现错误时才能实现。你是怎样做的?通常会崩溃或放置一个陷阱异常并以某种方式通知开发人员的全局异常处理程序。

捕获泛型异常并且不抛出它违背了先前的声明,所以建议不要这样做。

它通常被接受为一个很好的做法,快速失败(here a description

最后但并非租给你通常不想要赶上例外,你不知道如何才能恢复。如果你有一个bug并且你有一个ArgumentNullException,你会在你的应用程序中做什么?在你的代码中没有任何东西可以从这种情况中恢复,你必须失败,告知用户和开发者并结束应用程序。

这看起来像你只想赶上OracleException基于该例外的某些条件。好消息是,随着C#6.0你可以添加一个when条款补充一点情况:

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

这意味着,如果ex.Number不是20001,抛出的异常会检查你的下一个catch子句,在这种情况下,它会陷入你的通用捕获。

通用抓不管是不是应该有高达辩论,作为一个经验一般规则,你不应该有通用的异常处理。如果你不知道为什么代码抛出异常,你怎么能期望成功处理它?

+0

不错,那么如果它不是20001型会发生什么?我想这是我不知道如何处理。 – Dritzz

+0

@Dritzz查看更新 – ediblecode

+0

看起来不是正在运行的6.0,并且无法在短期内更新它 – Dritzz