加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#异常处理的范围

发布时间:2020-12-16 00:03:58 所属栏目:百科 来源:网络整理
导读:C#中的异常处理范围是什么?我目前正在审查我团队中另一位程序员的一些代码,他的功能有点像这样: private void function1() {try {function2();}catch (Exception ex) {EmailException(ex.message());}}private void function2() {try {// Do stuff}catch (
C#中的异常处理范围是什么?我目前正在审查我团队中另一位程序员的一些代码,他的功能有点像这样:

private void function1() {
try {
function2();
}
catch (Exception ex) {
EmailException(ex.message());
}}

private void function2() {
try {
// Do stuff
}
catch (Exception ex) {
// Handle it here
}}

大部分处理代码都在function2中.但是他的报告处理是在function1中. function2中的异常会回到发送报告的function1处理程序吗?

编辑:
感谢您的回复,他们都非常有帮助!

解决方法

在.net中,当发生异常时,系统将搜索堆栈上的嵌套try块以确定是否存在可以捕获异常的catch块.这发生在任何finally块运行之前.如果没有任何可以捕获异常的块,系统将调用“未处理的异常”处理程序而不运行任何finally块.

如果确定存在可以捕获异常的块的系统,它将开始展开堆栈并运行最终与内部try块关联的块,直到它将堆栈一直展开到它找到的catch块,或者在finally块的执行中抛出异常.在后一种情况下,先前的例外将被放弃而不再进一步处理;异常处理将重新启动新抛出的异常.

虽然想要捕获异常之间存在语义差异,而仅仅想要对其进行操作(但让它被视为未被捕获),但是在C#中没有简洁的方式来表达这种区别;捕获异常的代码有望解决它.在C#中可以做的最好的事情是使用一个catch(指示系统的异常处理逻辑,认为一个将捕获异常),然后使用throw,表示一个人不想解决它(这个将在内部“finally”块运行后发生).在诸如vb.net之类的其他语言中,可以在最终块运行之前对异常进行操作而不捕获它们.虽然没有大量的情况下捕获和抛出与捕获异常而不捕获异常的情况不同,但很少有区别重要的情况.如果一个人正在使用C#并且希望避免对可能希望在终结器块运行之前从内部代码捕获异常的周围代码产生敌意,那么最好的方法可能是编写一个用vb编写的异常处理包装器方法(或者让其他人使用执行此操作),将其编译为DLL,然后使用lambdas提供这样的函数方法,以便在适当的try / filter / catch / finally块中调用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读