我目前正在编写一个小框架,将供公司内部的其他开发人员使用。
我想提供良好的智能感知信息,但我不确定如何记录抛出的异常。
在下面的示例中:
public void MyMethod1()
{
MyMethod2();
// also may throw InvalidOperationException
}
public void MyMethod2()
{
System.IO.File.Open(somepath...); // this may throw FileNotFoundException
// also may throw DivideByZeroException
}
我知道记录异常的标记是:
/// <exception cref="SomeException">when things go wrong.</exception>
我不明白的是,如何记录由 MyMethod1()
调用的代码引发的异常
我是否应该记录MyMethod2()
File.Open()
引发的异常?记录可能的异常的最佳方式是什么?
发布于 2009-01-20 05:51:30
您应该记录代码可能引发的每个异常,包括您可能调用的任何方法中的异常。
如果列表变得有点大,您可能希望创建自己的异常类型。捕获方法中可能遇到的所有异常,将它们包装在异常中,然后抛出异常。
另一个你可能想要这样做的地方是,如果你的方法在你的API的表面上。就像facade将多个接口简化为单个接口一样,您的API应该将多个异常简化为单个异常。使调用者更容易使用您的代码。
为了回答Andrew的一些担忧(来自评论),有三种类型的例外:一种是你不知道的,一种是你知道但无能为力的,还有一种是你知道并可以做些什么的。
那些你不知道的你想放手的人。这是快速失败的原则--最好是让你的应用程序崩溃,而不是进入一个你可能最终会破坏数据的状态。崩溃将告诉你发生了什么以及为什么,这可能有助于将该异常从“你不知道的”列表中移出。
你所知道但又无能为力的是OutOfMemoryExceptions这样的异常。在极端情况下,你可能想要处理像这样的异常,但除非你有一些非常重要的需求,否则你会把它们当作第一类--让它们去吧。你必须记录这些异常吗?在每一个新创建对象的方法上记录OOM看起来都是相当愚蠢的。
那些你知道并且可以做些什么的是那些你应该记录和包装的。
发布于 2009-01-20 05:46:28
您应该使用standard xml documentation。
/// <exception cref="InvalidOperationException">Why it's thrown.</exception>
/// <exception cref="FileNotFoundException">Why it's thrown.</exception>
/// <exception cref="DivideByZeroException">Why it's thrown.</exception>
public void MyMethod1()
{
MyMethod2();
// ... other stuff here
}
/// <exception cref="FileNotFoundException">Why it's thrown.</exception>
/// <exception cref="DivideByZeroException">Why it's thrown.</exception>
public void MyMethod2()
{
System.IO.File.Open(somepath...);
}
/// <exception cref="FileNotFoundException">Why it's thrown.</exception>
public void MyMethod3()
{
try
{
MyMethod2();
}
catch (DivideByZeroException ex)
{
Trace.Warning("We tried to divide by zero, but we can continue.");
}
}
这样做的价值在于,您提供了可能发生的已知异常的文档。如果您使用的是visual studio,则此文档在intellisense中可用,并且可以在以后提醒您(或其他人)您可能会遇到的异常。
您希望指定特定的异常类型,因为您可能能够处理一种类型的异常,而其他类型是严重问题的结果,无法更正。
发布于 2009-01-20 06:28:12
您可以通过使用几个很棒的插件来简化文档处理过程。其中之一是GhostDoc,这是Visual Studio的一个免费插件,可以生成XML-doc注释。另外,如果您使用ReSharper,可以看看优秀的ReSharper Agent Johnson Plugin,它添加了一个为抛出的异常生成ReSharper注释的选项。
更新:似乎阿根·约翰逊不能用于R# 8,请检查Exceptional for ReSharper作为替代...
XML第1步: GhostDoc生成
注释(Ctrl-Shift-D),而ReSharper的代理约翰逊插件建议也记录异常:
第2步:使用ReSharper的快捷键(Alt-Enter)添加异常文档:
step 2 http://i41.tinypic.com/osdhm
希望这能有所帮助:)
https://stackoverflow.com/questions/461306
复制相似问题