Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ref查看错误_C# - Fatal编程技术网

C# 使用ref查看错误

C# 使用ref查看错误,c#,C#,我现在在一家公司工作,在每个功能中都使用ref。 原因是为了捕捉错误。 例如: //return true if the read is success //otherwise writing to the error ,the problem bool ReadFile(ref string error) 问题: 如何捕捉错误? 使用ref、异常或其他方式?在某些情况下,这是一种可接受的模式。您可以在诸如int.TryParse(…)等方法以及框架中的所有其他Try…方法中看到它(尽管它们

我现在在一家公司工作,在每个功能中都使用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
的世界来表示错误/成功,我们有充分的理由摆脱这种风格。

在某些情况下,这是一种公认的模式。您可以在诸如
int.TryParse(…)
等方法以及框架中的所有其他
Try…
方法中看到它(尽管它们在IMO中实现得更好)。但它不应该被专门使用,而不是例外情况。异常并不完美,但它们提供了比这更大的灵活性和控制。这基本上是回到
HRESULTs
ints
的世界来表示错误/成功,我们有充分的理由摆脱这种风格。

我认为异常是提供错误处理机制的最方便、最健壮和最自然的方式。与错误代码和其他东西相比,它们的功能非常丰富。主要的问题是实际将异常情况分类为“异常”。如果情况不是“异常”,那么上述策略就可以了。

我认为异常是提供错误处理机制的最方便、最可靠和最自然的方式。与错误代码和其他东西相比,它们的功能非常丰富。主要的问题是实际将异常情况分类为“异常”。如果情况不是“例外”,那么上述策略就可以了。

在例外情况下使用例外(即,不应该发生或超出您控制范围的事情)

您可以使用返回类型(您使用的是
bool
)来指示操作是否成功


就我个人而言,我不喜欢
ref
参数,因为它们有非常具体的类型约束(即非多态性-您必须使用传入的类型),并假设它们传入的函数会产生副作用。

在异常情况下使用异常(即,不应该发生或超出您控制范围的事情)

您可以使用返回类型(您使用的是
bool
)来指示操作是否成功

就我个人而言,我不喜欢
ref
参数,因为它们有非常特定的类型约束(即非多态性-您必须使用传入的类型),并假设它们传入的函数会产生副作用。

我将

bool ReadFile(ref string error)
在try-catch块中,不使用ref字符串。Try-catch是普遍接受的捕获和处理错误的方法

如果您使用的是.net 4.0,并且确实反对抛出异常,那么也可以使用元组:

Tuple<bool, string>
元组
因此:

private Tuple ReadFile()
{
...
}
我会把

bool ReadFile(ref string error)
在try-catch块中,不使用ref字符串。Try-catch是普遍接受的捕获和处理错误的方法

如果您使用的是.net 4.0,并且确实反对抛出异常,那么也可以使用元组:

Tuple<bool, string>
元组
因此:

private Tuple ReadFile()
{
...
}

除了在每个函数上使用
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!" );

除了在每个函数上使用
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!" );

这要视情况而定,有时您对发生的错误没有问题,只是想继续前进,例如在一个紧密的循环中。如果您在这里捕获到异常,您的循环将运行得明显较慢。不一定,要获取异常消息,您必须引发异常,这是一个昂贵的部分。不向调用函数冒泡并不是在保存任何内容。这取决于,有时发生错误时您不会有问题,只是想继续,例如在一个紧密的循环中。如果您在这里捕获到异常,您的循环将运行得明显较慢。不一定,要获取异常消息,您必须引发异常,这是一个昂贵的部分。不向调用函数冒泡并不能保存任何内容。另一方面,使用IDataErrorInfo接口有一个类似模式的类范围实现。它允许您基于总体类状态提供更复杂的错误报告,并且有内置的方法将输出与UI(特别是在WPF中)集成。我认为这是一个更好的选择,而不是每个调用的REF错误消息。使用接口IDataErrorInfo有一个类似模式的类范围实现。它允许您基于整个类状态提供更复杂的错误报告,并且有内置的方法将输出与UI集成(特别是在WPF中)。