繁体   English   中英

很好的异常处理

[英]nicely exception handling

在我们的应用程序中,我们使用其他团队开发的组件。 问题是我该如何定义比这更好的异常处理方式

   try
   {
    someComponent.DoStuff();
   }

   catch (Exception ex)
   {
    textLabel= ex.Message;
   }

该组件没有自定义异常类型,也许做一个好的方法是定义一个组件特定的Exception类型并以某种方式包装它? 我知道这个问题是非常基本的,但是我对让我们说出这样做的好处感到更加感兴趣。 如果调用没有自定义异常类型的其他组件,如何以一种优雅的方式处理任何潜在的异常?

理想情况下,您将让组件开发团队为您执行此操作-他们还希望客户如何识别并处理其组件中的错误? 界定组件可能引发的异常是良好的C#设计的基本组成部分。

如果那不是一种选择,那么在组件顶部实施自己的包装器以对其故障案例进行分类听起来像是次佳选择,并且您非常讨价还价。

如果第三方库的文档记录不充分(它们没有指定每种方法都可以抛出的异常),则可以使用一些工具来反映代码并确定可能抛出的异常。 这可能会让人望而生畏(对于任何给定的调用都可能抛出异常数量的异常),但是从原理上讲,比捕获常规的Exception类型更好。 这是执行此类分析的一种商业产品

当发现错误时,您可以将其重新打包,然后引发另一个错误,在最基本的级别上,您可能只是添加了更多数据-但是,根据您的建议,您也可以将通用错误替换为自定义错误那虽然不能克服您从组件获得的响应的局限性,但却可以使代码在调用堆栈中更远的地方有机会进行更适当的响应。

因此,就以最基本的方式添加信息而言-通过抛出带有一些其他文本的新异常,同时仍然传递原始异常:

catch (Exception ex)
{
    throw new Exception("This is more about where the exception occurred", ex);
}

现在,如果要定义自己的自定义组件异常,则可以将new Exception更改为new ComponentSpecificException并根据需要向构造函数添加数据,但不要忘记设置内部异常。 异常还具有键,值对的数据集合,您可以在其中插入更多信息(通过创建异常,添加数据然后进行抛出)。

这都是相当通用的-从那里开始,您不一定可以预期要处理的所有异常,而不必尝试-设置日志记录,以便知道何时有通用异常,即最终捕获-然后随着时间的流逝,在泛型之上添加特定于异常的捕获,以提供更适当的响应,或者至少将错误打包为不太通用的自定义异常。

不能肯定我已经很好地解释了这一点-但概念是,由于难以预测每个可能的错误,因此当您发现新的异常时,您希望有一种系统地开发应用程序的策略。

假设您想捕获每种类型的异常,此解决方案对我来说似乎很好。

根据您对使用该组件的了解,或者通过使用Reflector之类的东西来分析已编译的组件,该组件可能引发哪些异常? 为它们提供异常处理程序是否可以使您向用户提供更好的反馈?

处理异常的唯一合理的方法(少得多的“优雅”)是,如果无法从异常中恢复,则将其记录下来。

然后通知用户存在问题,并为他们提供再次尝试的机会(如果它是交互式程序)。

如果您的应用程序专用于.NET开发人员,请继续向他们显示异常消息(尽管Exception.ToString更好,因为它包含堆栈跟踪)。 否则,请勿在用户界面中显示异常消息-这是一个安全漏洞,只会使用户感到困惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM