共用方式為


例外狀況和效能

更新:2007 年 11 月

擲回例外狀況可能會對效能產生負面的影響。如果是經常失敗的程式碼,您可使用設計模式,讓效能問題減至最少。這個主題將描述當例外狀況可能會對效能產生重大影響時,非常有用的兩個設計模式。

不要因為顧慮例外狀況可能對效能帶來不良影響,而使用錯誤碼。

請使用設計來減少效能問題。這個主題中將描述兩個模式。

請考慮針對在一般情況下可能擲回例外狀況的成員使用 Tester-Doer 模式,以避免發生與例外狀況有關的效能問題。

Tester-Doer 模式會將可能擲回例外狀況的一個呼叫分成兩部分:Tester 和 Doer。Tester 會針對可能讓 Doer 擲回例外狀況的狀態執行測試,剛好會在擲回例外狀況的程式碼之前插入測試,藉此保護例外狀況。

下列程式碼範例將示範這個模式的 Doer 部分。此範例包含一個方法,此方法會在傳遞 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 Doer
{
    // Method that can potential throw exceptions often.
    public static void ProcessMessage(string message)
    {
        if (message == null)
        {
            throw new ArgumentNullException("message");
        }
    }
    // Other methods...
}

下列程式碼範例將示範這個模式的 Tester 部分。這個方法會在 Doer 擲回例外狀況時,使用測試來防止對 Doer (ProcessMessage) 產生呼叫。

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 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);
            }
        }
    }
}

請注意,如果您在多執行緒的應用程式中使用這個模式 (此時,測試會牽涉到可變動的物件),您必須處理可能發生的競爭情形。執行緒可以在測試之後,而在 Doer 執行之前,變更可變動物件的狀態。請使用執行緒同步處理技術來處理這些問題。

請考慮針對在一般情況下可能擲回例外狀況的成員使用 TryParse 模式,以避免發生與例外狀況有關的效能問題。

若要實作 TryParse 模式,您要提供兩個不同的方法,以便執行於一般情況下可能擲回例外狀況的作業。第一個方法 X, 會執行作業,並在適當時機擲回例外狀況。第二個方法 TryX, 不會擲回例外狀況,但是會傳回 Boolean 值,以指示成功或失敗。由 TryX 的成功呼叫所傳回的所有資料都是透過 out (Visual Basic 中為 ByRef) 參數傳回。ParseTryParse 方法都是這個模式的範例。

一定要針對使用 TryParse 模式的每一個成員提供例外狀況擲回成員。

只提供 TryX 方法幾乎都不是正確的設計,因為它需要了解 out 參數。此外,在最常見的情況下,例外狀況產生的效能影響都不是問題;您應該提供可在最常見情況下輕鬆使用的方法。

Portions Copyright 2005 Microsoft Corporation.All rights reserved.

Portions Copyright Addison-Wesley Corporation.All rights reserved.

如需設計方針的詳細資訊,請參閱由 Krzysztof Cwalina 和 Brad Abrams 所著,並由 Addison-Wesley 於 2005 年發行的「Framework 設計方針:可重複使用之 .NET 程式庫的慣例、慣用語法和模式」一書。

請參閱

其他資源

開發類別庫的設計方針

例外狀況的設計方針