捕获异常处理catch(Exceptionex){...throwex;有什么区别?}并使用catch//可能包括(Exception){...throw;}throwex从那时起重新抛出异常对象。这通常很糟糕,因为它破坏了导致原始问题的有用调用堆栈信息。最初捕获的异常从实际抛出的地方开始抛出。它会保留到该点为止的调用堆栈信息,而不是您捕获的点。catch(Exception)和catch本质上是同一件事,除了显然第一个给你异常对象来做某事,而第二个没有。但是两者都会捕获所有异常。它们与catch(SomeKindOfException)相同,后者仅捕获该特定类型(或从该类型派生的更特定类型)的异常。这适用于以下情况:try{//somefileoperation}catch(FileNotFoundExceptionfnfex){//filenotfound-我们知道如何处理这个}//任何其他类型的异常,//我们没有预料到并且can'tknowhowtohandle,//不会被正常捕获和抛出在framework1.x中使用不带参数的catch来捕获非托管代码抛出的异常是非常有用的。从框架版本2(IIRC)开始,所有非托管异常都包装在托管异常对象中,因此不再使用无参数捕获。No-argumentthrow不特定于no-argumentcatch,它可以用在任何catch块中。区别在于使用throw;返回异常抛出时;它不会覆盖最初抛出异常时的堆栈跟踪,因此这是重新抛出异常的正确方法。而不是使用throwex;在catch块中,您应该抛出一个新创建的包含要添加的信息的异常,并将原始异常作为内部异常。这样你就得到了最初的失败点,以及你抓住它并重新抛出它的地方。因此,您不应在问题示例中使用任何组合。您始终指定异常类型,然后重新启动异常:catch(Exceptionex){...throw;}或者你抛出一个内部异常的新异常:catch(Exceptionex){...thrownewApplicationException("Ooops!,ex);请注意,您应该很少捕获Exception基类,而是捕获适合您预期错误的更具体的异常类。捕获您不知道如何处理的异常通常没有意义。好吧,第一个将擦除堆栈跟踪,并将其替换为您的抛出位置。第二个将抛出异常而不更改堆栈跟踪。此外,“catch”将捕获任何抛出的东西,无论它是否是异常。第二个其实相当于做“capture(object)”。第一个重置抛出的异常中的stacktrace属性据我所知它是相同的(使用Exception..因为所有异常都来自该类)。当您只捕获一个异常的孩子时,或者当您有多个捕获不同孩子的“捕获”时,它会变得不同。也可能是您捕获异常,修改消息并丢弃它。以上就是C#学习教程:捕获异常处理分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
