throw

更新时间:2022-12-28 05:18:43 阅读: 评论:0


2022年12月28日发(作者:麦克杰克逊的歌)

[原译]C#中的throw

Throw会抛出/传递异常,通过在catch块⾥使⽤throw语句.可以改变产⽣的异常,⽐如我们可以抛出⼀个新的异常,throw语句有各种各样的,并且

很有必要.

例⼦

我们⾸先看⼀下三个⽅法,分别叫做A,B,C,他们使⽤不同的throw语句。⽅法A使⽤了⽆参的throw语句。这可以被看作是rethrow(继续抛出)

—他会抛出已经出现的同样的异常

继续,⽅法Bthrow⼀个命名的异常变量。这就不是⼀个完全的rethrow了—因为他虽然抛出了同样的异常。但是改变了StackTrace(堆栈轨

迹),如果有必要的话,我们可以收集⼀些异常信息,⽽⽅法C则创建了⼀个新的异常。

提⽰:你可以通过这种⽅法实现⾃定义的的错误处理

使⽤throw语句的例⼦

usingSystem;

classProgram

{

staticvoidMain()

{

try

{

A();

B();

C(null);

}

catch(Exceptionex)

{

ine(ex);

}

}

staticvoidA()

{

//Rethrow语法.

try

{

intvalue=1/("0");

}

catch

{

throw;

}

}

staticvoidB()

{

//过滤异常类型.

try

{

intvalue=1/("0");

}

catch(DivideByZeroExceptionex)

{

throwex;

}

}

staticvoidC(stringvalue)

{

//创建新的异常.

if(value==null)

{

thrownewArgumentNullException("value");

}

}

}

程序可能的输出结果

ByZeroException:Attemptedtodividebyzero.

ByZeroException:Attemptedtodividebyzero.

ntNullException:Valuecannotbenull.

Parametername:value

Rethrow

接着我们看更多的关于rethrows的细节。Rethrow必须是⼀个⽆参的throw语句。如果使⽤throwex,那么TargetSie(TargetSite从堆栈跟踪

中获取抛出该异常的⽅法。如果堆栈跟踪为空引⽤,TargetSite也返回空引⽤。-译者注)和StackTrace都被改变了。

在下⾯的程序⾥,X()⽅法使⽤了rethrow语句。Y()使⽤了throwex语句。我们可以看看当rethrow语句使⽤的使⽤,引发异常的⽅法,也就是

异常的TargetSite是在StringToNumber---⼀个内部的⽅法。

但是:当throwex⽤的时候。就像在Y()⾥⾯,这个异常的TargetSite被修改到了当前的Y()⽅法⾥。

测试rethrow的例⼦

usingSystem;

classProgram

{

staticvoidMain()

{

try

{

X();

}

catch(Exceptionex)

{

ine(Site);

}

try

{

Y();

}

catch(Exceptionex)

{

ine(Site);

}

}

staticvoidX()

{

try

{

("?");

}

catch(Exception)

{

throw;//[Rethrow构造]

}

}

staticvoidY()

{

try

{

("?");

}

catch(Exceptionex)

{

throwex;//[Throw捕获的ex变量]

}

}

}

输出

VoidStringToNumber(,...)

VoidY()

本文发布于:2022-12-28 05:18:43,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/44867.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:communicated
标签:throw
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图