我現在正在使用ref在每個函數中使用ref。
原因,是爲了抓錯誤。
有例如:使用ref查看錯誤
//return true if the read is success
//otherwise writing to the error ,the problem
bool ReadFile(ref string error)
問:
你如何捕獲錯誤?
使用ref,異常或其他方式?
我現在正在使用ref在每個函數中使用ref。
原因,是爲了抓錯誤。
有例如:使用ref查看錯誤
//return true if the read is success
//otherwise writing to the error ,the problem
bool ReadFile(ref string error)
問:
你如何捕獲錯誤?
使用ref,異常或其他方式?
我認爲異常是提供錯誤處理機制的最方便,健壯和自然的方式。與錯誤代碼和其他內容相比,它們功能豐富。主要問題是實際分類異常情況,如「特殊」。如果情況不是「特殊」的話,那麼比上面的戰術就好了。
這是一種可接受的模式,在某些情況下。你可以在框架中看到int.TryParse(...)
和所有其他Try...
方法(儘管它們更好地實現IMO)。但它不應該被完全使用,而不是例外。例外情況並不完美,但它們提供了比這更多的靈活性和控制。這基本上回到了HRESULTs
和ints
的世界來表明錯誤/成功,我們有充分的理由遠離了這種風格。
對特殊情況(即不應發生或不在您控制範圍之內的情況)使用例外。
您可以使用返回類型(您正在使用bool
)來指示操作是否成功。
就個人而言,我不喜歡ref
參數,因爲他們有非常特殊的限制(即不是多態 - 你有使用傳入的類型),並假定側通過影響他們獲得在傳遞函數。
那麼你將如何知道錯誤原因? – Avram 2010-05-05 14:48:11
我會把
bool ReadFile(ref string error)
在try catch塊,而不是使用REF字符串。嘗試捕捉是捕捉和處理錯誤的普遍接受的方式。
如果您使用的是.NET 4.0和你真的對拋出異常,你可以使用一個元組也:
Tuple<bool, string>
這樣:
private Tuple<bool, string> ReadFile()
{
...
}
這取決於,有時你很好,發生錯誤,只是想繼續前進,如在一個緊密的循環。如果你在這裏發現異常,你的循環會顯着變慢。 – 2010-05-05 14:40:20
不一定,要獲得異常消息,您必須提出異常消息,這是非常昂貴的部分。通過不向冒泡功能冒泡,你不會保存任何東西。 – kemiller2002 2010-05-05 14:55:49
有很多替代品在每次使用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!");
我過去曾多次做過這種類似的事情......但我從來沒有想過要將它隱式轉換爲布爾!謝謝! – Curtis 2010-05-05 15:14:13
在一個側面說明,有使用接口IDataErrorInfo的一個類似的模式的一類範圍內推行。它允許您提供基於整體類狀態的更復雜的錯誤報告,並且有內置的方法來將輸出與UI集成(特別是在WPF中)。我認爲這是比信息錯誤報告更好的選擇,而不是「ref」錯誤每個呼叫的消息。 – 2010-05-05 14:44:48