我现在正致力于在每项功能中使用ref 原因是捕捉错误 例如:
//return true if the read is success
//otherwise writing to the error ,the problem
bool ReadFile(ref string error)
问题:
你如何捕捉错误?
使用ref,例外或其他方式?
答案 0 :(得分: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!" );
答案 1 :(得分:1)
我认为异常是提供错误处理机制的最方便,最强大和最自然的方式。与错误代码和其他内容相比,它们的功能非常丰富。主要问题是实际上对“异常”等异常情况进行分类。如果情况不是“例外”,那么上述策略就可以了。
答案 2 :(得分:0)
在某些情况下,这是一种可接受的模式。您可以在int.TryParse(...)
等方法和框架中的所有其他Try...
方法中看到它(尽管它们更好地实现了IMO)。但它不应该专门使用,而不是例外。例外并不完美,但它们提供了比这更多的灵活性和控制力。这基本上回到HRESULTs
和ints
的世界来表示错误/成功,我们有充分的理由摆脱了这种风格。
答案 3 :(得分:0)
在特殊情况下使用例外(即不应发生或不受控制的事情)。
您可以使用返回类型(使用bool
)来指示操作是否成功。
就个人而言,我不喜欢ref
个参数,因为它们具有非常特定的类型约束(即不是多态的 - 你 使用传入的类型)并假设副作用他们传入的功能。
答案 4 :(得分:0)
我会把
bool ReadFile(ref string error)
在try catch块中,不使用ref字符串。 Try catch是普遍接受的捕获和处理错误的方法。
如果你使用.net 4.0并且你真的反对抛出异常,你也可以使用元组:
Tuple<bool, string>
这样:
private Tuple<bool, string> ReadFile()
{
...
}