Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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# 如何抛出异常_C#_Exception_C# 4.0_Try Catch_Throw - Fatal编程技术网

C# 如何抛出异常

C# 如何抛出异常,c#,exception,c#-4.0,try-catch,throw,C#,Exception,C# 4.0,Try Catch,Throw,在throw和抛出ex?有吗?例如,关于这个简单的片段: try{ // some code } catch (Exception ex) { // some catcher code // throw; ? // or // throw ex; ? // how to decide which one? } 更新: 我知道上面两个的区别。问题是如何决定使用其中一个?有什么最佳实践可以做出更好的选择吗?您应该使用throw重新抛出原始异常(使用原

throw
抛出ex?有吗?例如,关于这个简单的片段:

try{
    // some code
} catch (Exception ex) {
    // some catcher code
    // throw; ?
    // or
    // throw ex; ?
    // how to decide which one?
}
更新:
我知道上面两个的区别。问题是如何决定使用其中一个?有什么最佳实践可以做出更好的选择吗?

您应该使用
throw
重新抛出原始异常(使用原始堆栈跟踪)或使用
抛出新的MyException(…,ex)
引发您自己的异常,该异常可能提供附加信息,并将内部异常设置为ex

如果您没有任何其他信息,只需使用
throw

如果您只捕获异常以进行清理,那么请使用
尝试{…}最终{…}

这非常有用

是否要保留堆栈跟踪以查看异常发生的确切位置?然后使用
throw
,这就像根本不使用
catch
一样

您是否只关心当前方法的调试信息?然后
抛出ex

证明:

static void Main(string[] args)
{
    try
    {
        Test();
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}

static void Test()
{
    try
    {
        // long lambda chain
        new Action(() => new Action(() => new Action(() => { throw new InvalidOperationException(); })())())();
    }
    catch (Exception ex)
    {
        //throw;
        //throw ex;
    }
}
throw
将保留堆栈跟踪:

System.InvalidOperationException: Operation is not valid due to the current state of the object.
    at ConsoleApplication.Program.<>c.<Test>b__1_2() in ConsoleApplication\Program.cs:line 22
    at ConsoleApplication.Program.<>c.<Test>b__1_1() in ConsoleApplication\Program.cs:line 22
    at ConsoleApplication.Program.<>c.<Test>b__1_0() in ConsoleApplication\Program.cs:line 22
    at ConsoleApplication.Program.Test() in ConsoleApplication\Program.cs:line 26
    at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication\Program.cs:line 13
System.InvalidOperationException: Operation is not valid due to the current state of the object.
    at ConsoleApplication.Program.Test() in ConsoleApplication\Program.cs:line 27
    at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication\Program.cs:line 13

至于最佳实践-选择通常是,作为开发人员,您希望获得尽可能多的信息,
throw ex
是对应的-一些信息是隐藏的,但可能您想隐藏它,谁知道呢?

使用
throw
,这会保留原始堆栈跟踪。但为什么你会抓住一个普遍的例外呢?在我看来,你无法处理它,那么为什么要抓住它呢?@Maarten有时会这样。重试某些操作,例如@Sinatr可能重复请参阅更新。先谢谢你。