在现实世界的场景中纠正异常处理

时间:2013-10-16 15:24:26

标签: c# exception-handling

我没有太多的异常经验,我试图弄清楚如何在现实场景中正确使用异常处理。在C#。

在这个例子中,我有一个顶级函数LoadModel,它调用许多其他函数(调用其他函数,......):

class Core
{
    public void LoadModel(string file_name)
    {
        try
        {
            // call other functions (that call other functions, …) that may throw exceptions
        }
        catch (Exception ex)
        {
            if (ex is ArgumentNullException ||
                ex is ArgumentException ||
                ex is EncoderFallbackException ||
                ex is InvalidOperationException ||
                ex is XmlException ||
                ex is InvalidDataException ||
                ex is IOException)
            {
                // show error message
            }
            else
            {
                // unsupported exception. system may be unstable. let it crash.
                throw;
            }               
        }
    }
}

我遵守这条规则:

  • 所有函数都使用异常报告错误,即它们不会返回 错误代码。它与.NET框架中的范例相同。
  • 如果你在某个较低级别的功能中,并且发生异常而不是 适合于在这个地方向用户报告失败,不要捕获异常并让它向上传播调用堆栈。
  • 不要使用空捕获 捕捉顶级的所有例外情况。它会隐藏你的问题 应用程序可以破坏它的稳定性。只捕获您知道如何的例外 从中恢复。

问题:这是处理异常的方法吗?即我检查我的保护代码产生了什么异常(考虑所有嵌套函数),决定从哪个恢复是安全的并将它们放入高级别的catch中。我可以从他们的文档中获取.NET函数的异常列表,对于我自己的函数,我应该在他们的文档中保留异常列表。并且这个异常列表倾向于积累:一个函数可以抛出它自己的异常和嵌套函数的异常......。这似乎容易让我感到错误。有人在某些嵌套函数中添加了新的异常,并且您的顶级catch不会处理它。使用错误代码,您可以执行类似“if(error!= SUCCESS)”的操作来捕获所有错误,但是您不能使用异常(如果您不想使用空捕获)。

1 个答案:

答案 0 :(得分:2)

您可以以级联方式捕获多种异常:

try 
{

  //some code

}
catch (NonGenericException nonGenericEx) 
{

}
catch (MoreGenericException moreGenericEx) 
{

}
catch (Exception mostGenericException) 
{

} 
finally
{
  //this code will always be executed
}