2010-05-05 69 views
0

我現在正在使用ref在每個函數中使用ref。
原因,是爲了抓錯誤。
有例如:使用ref查看錯誤

//return true if the read is success 
//otherwise writing to the error ,the problem 
bool ReadFile(ref string error) 

問:
你如何捕獲錯誤?
使用ref,異常或其他方式?

+0

在一個側面說明,有使用接口IDataErrorInfo的一個類似的模式的一類範圍內推行。它允許您提供基於整體類狀態的更復雜的錯誤報告,並且有內置的方法來將輸出與UI集成(特別是在WPF中)。我認爲這是比信息錯誤報告更好的選擇,而不是「ref」錯誤每個呼叫的消息。 – 2010-05-05 14:44:48

回答

1

我認爲異常是提供錯誤處理機制的最方便,健壯和自然的方式。與錯誤代碼和其他內容相比,它們功能豐富。主要問題是實際分類異常情況,如「特殊」。如果情況不是「特殊」的話,那麼比上面的戰術就好了。

0

這是一種可接受的模式,在某些情況下。你可以在框架中看到int.TryParse(...)和所有其他Try...方法(儘管它們更好地實現IMO)。但它不應該被完全使用,而不是例外。例外情況並不完美,但它們提供了比這更多的靈活性和控制。這基本上回到了HRESULTsints的世界來表明錯誤/成功,我們有充分的理由遠離了這種風格。

0

對特殊情況(即不應發生或不在您控制範圍之內的情況)使用例外。

您可以使用返回類型(您正在使用bool)來指示操作是否成功。

就個人而言,我不喜歡ref參數,因爲他們有非常特殊的限制(即不是多態 - 你使用傳入的類型),並假定側通過影響他們獲得在傳遞函數。

+0

那麼你將如何知道錯誤原因? – Avram 2010-05-05 14:48:11

0

我會把

bool ReadFile(ref string error) 

在try catch塊,而不是使用REF字符串。嘗試捕捉是捕捉和處理錯誤的普遍接受的方式。

如果您使用的是.NET 4.0和你真的對拋出異常,你可以使用一個元組也:

Tuple<bool, string> 

這樣:

private Tuple<bool, string> ReadFile() 
{ 
... 
} 
+0

這取決於,有時你很好,發生錯誤,只是想繼續前進,如在一個緊密的循環。如果你在這裏發現異常,你的循環會顯着變慢。 – 2010-05-05 14:40:20

+0

不一定,要獲得異常消息,您必須提出異常消息,這是非常昂貴的部分。通過不向冒泡功能冒泡,你不會保存任何東西。 – kemiller2002 2010-05-05 14:55:49

2

有很多替代品在每次使用ref string sError函數作爲輸入,但仍然能夠使用布爾比較來檢查錯誤。

以下是我過去使用的一種模式:創建一個OperationError對象,您可以從可報告錯誤信息的方法返回。更好的是,可以將其隱式轉換爲bool,以便在您不關心消息時更容易進行測試。

下面是一個例子:

public sealed class OperationError 
{ 
    public bool IsError { get; private set; } 
    public string ErrorMessage { get; private set; } 

    public static implicit operator bool(OperationError err) 
    { 
     return IsError; 
    } 

    // returned to indicate success 
    public static readonly OperationError Success = 
     new OperationError(); 

    private OperationError() {} 

    public OperationError(string errorMessage) 
    { 
     ErrorMessage = errorMessage ?? "Unknown error";   
    } 
} 

// here's a case that demonstrates the usage: 
public OperationError SomeMethod() 
{ 
    if(someError()) 
     return new OperationError("someError failed, oops!"); 

    return OperationError.Success; // all is well... 
} 


// somewhere else in your code... 
var result = SomeMethod(); 
if(result.IsError) 
    Console.WriteLine(result.ErrorMessage); 

// alternatively...use the implicit bool conversion... 
if(!SomeMethod()) 
    throw new ApplicationException("Oh no!"); 
+0

我過去曾多次做過這種類似的事情......但我從來沒有想過要將它隱式轉換爲布爾!謝謝! – Curtis 2010-05-05 15:14:13