异常引发

更新:2007 年 11 月

当某一成员无法成功执行它应执行的操作时,将引发异常。这称为执行故障。例如,如果 Connect 方法无法连接到指定的远程终结点,则这就是一个执行故障,将有一个异常被引发。

下列准则可帮助确保在适当时引发异常。

不要返回错误代码。异常是报告框架中的错误的主要手段。

异常设计准则讨论了使用异常的许多好处。

尽可能不对正常控制流使用异常。除了系统故障及可能导致争用状态的操作之外,框架设计人员还应设计一些 API 以便用户可以编写不引发异常的代码。例如,可以提供一种在调用成员之前检查前提条件的方法,以便用户可以编写不引发异常的代码。

下面的代码示例演示如何进行测试以防止在消息字符串为 null(在 Visual Basic 中为 Nothing)时引发异常。

Public Class Doer

    ' Method that can potential throw exceptions often.
    Public Shared Sub ProcessMessage(ByVal message As String)
        If (message = Nothing) Then
            Throw New ArgumentNullException("message")
        End If
    End Sub

    ' Other methods...
End Class

Public Class Tester

    Public Shared Sub TesterDoer(ByVal messages As ICollection(Of String))
        For Each message As String In messages
            ' Test to ensure that the call 
            ' won't cause the exception.
            If (Not (message) Is Nothing) Then
                Doer.ProcessMessage(message)
            End If
        Next
    End Sub
End Class
public class Doer
{
    // Method that can potential throw exceptions often.
    public static void ProcessMessage(string message)
    {
        if (message == null)
        {
            throw new ArgumentNullException("message");
        }
    }
    // Other methods...
}

public class Tester
{
    public static void TesterDoer(ICollection<string> messages)
    {
        foreach (string message in messages)
        {
            // Test to ensure that the call
            // won't cause the exception.
            if (message != null)
            {
                Doer.ProcessMessage(message);
            }
        }
    }
}

有关可以减少异常引发数量的设计方案的其他信息,请参见异常和性能

不要包含可以根据某一选项引发或不引发异常的公共成员。

例如,不要定义如下所示的成员:

Private Function ParseUri(ByVal uriValue As String, ByVal throwOnError As Boolean) As Uri
Uri ParseUri(string uriValue, bool throwOnError)

不要包含将异常作为返回值或输出参数返回的公共成员。

此项准则适用于公共可见的成员。使用私有帮助器方法构造和初始化异常是可以接受的。

考虑使用异常生成器方法。从不同的位置引发同一异常会经常发生。为了避免代码膨胀,请使用帮助器方法创建异常并初始化其属性。

帮助器方法不得引发异常,否则堆栈跟踪将无法正确反映出引发异常的调用堆栈。

不要从异常筛选器块中引发异常。当异常筛选器引发异常时,公共语言运行库 (CLR) 将捕获该异常,然后该筛选器返回 false。此行为与筛选器显式执行和返回 false 的行为无法区分,因此很难调试。

有些语言(如 C#)不支持异常筛选器。

避免从 finally 块中显式引发异常。可以接受因调用引发异常的方法而隐式引发的异常。

部分版权所有 2005 Microsoft Corporation。保留所有权利。

部分版权所有 Addison-Wesley Corporation。保留所有权利。

有关设计指南的更多信息,请参见 Krzysztof Cwalina 和 Brad Abrams 编著、Addison-Wesley 于 2005 年出版的“Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries”(《框架设计指南:可重用 .NET 库的约定、术语和模式》)。

请参见

概念

选择要引发的正确异常类型

其他资源

类库开发的设计准则

异常设计准则