[原译]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小时内删除。
留言与评论(共有 0 条评论) |