使用ref查看错误

时间:2010-05-05 14:30:54

标签: c#

我现在正致力于在每项功能中使用ref 原因是捕捉错误 例如:

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

问题:
你如何捕捉错误?
使用ref,例外或其他方式?

5 个答案:

答案 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)。但它不应该专门使用,而不是例外。例外并不完美,但它们提供了比这更多的灵活性和控制力。这基本上回到HRESULTsints的世界来表示错误/成功,我们有充分的理由摆脱了这种风格。

答案 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()
{
...
}