例外狀況和效能
更新: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) 參數傳回。Parse 和 TryParse 方法都是這個模式的範例。
一定要針對使用 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 程式庫的慣例、慣用語法和模式」一書。