.net Net中的异常处理、判断和全局错误处理程序

.net Net中的异常处理、判断和全局错误处理程序,.net,exception,exception-handling,.net,Exception,Exception Handling,在.Net中: 1) 是否让异常传播到全局错误处理程序,在该处理程序中记录错误并显示消息框?我询问的原因是,如果您使用一个全局错误处理程序捕获顶部的异常,则需要一组Ifs来推断异常类型,然后显示一条可能友好的消息(例如,对于filenotfound,您提供的文件未找到,等等) 我的winforms应用程序中有一个全局错误处理程序。对于任何我无法处理的异常,他们点击这个处理程序,它记录异常并显示一条消息——但这是异常消息,有时我可能需要一些不同的东西,这取决于观众等等 2) 我只捕捉我能处理的异常

在.Net中:

1) 是否让异常传播到全局错误处理程序,在该处理程序中记录错误并显示消息框?我询问的原因是,如果您使用一个全局错误处理程序捕获顶部的异常,则需要一组Ifs来推断异常类型,然后显示一条可能友好的消息(例如,对于filenotfound,您提供的文件未找到,等等)

我的winforms应用程序中有一个全局错误处理程序。对于任何我无法处理的异常,他们点击这个处理程序,它记录异常并显示一条消息——但这是异常消息,有时我可能需要一些不同的东西,这取决于观众等等

2) 我只捕捉我能处理的异常。但是,我的应用程序在用户可选择的路径中有一组文件夹。由于默认共享被锁定和审核等,任何丢失的文件都是罕见的,因此是“异常事件”。但是当用户在他或她自己的电脑上选择一个位置时,文件可能会丢失,目录名太长,等等。我认为这更常见,所以不要在这里使用异常。但之前我提到我做了。对于这种冲突,有没有其他方法可以在不重复的情况下构造代码

3) 最后,有些例外情况我无法处理(例如,文件不存在,无法处理,因为文件是特殊格式的,仅由某些IT人员上载)。但这是罕见的。因此,对于方法中的这些异常,我不捕捉它们。然而,当有人看到这一点时(尽管有评论说这是在全球层面上发现的),其他开发人员会不寒而栗。这是因为他们的无知吗

Lassly,释放堆栈跟踪意味着什么

谢谢
}

在某种程度上,您的问题取决于您特定的操作环境和语言(您暗示过但从未透露),但在某种程度上,这些问题相当普遍。(不幸的是,这也是一个存在很多分歧的领域,无论是在不同的操作环境之间还是在单个开发人员之间,有时是在同一个项目上,因此我下面所说的可能需要根据您的上下文进行修改。)

在处理异常30多年后,我几乎看到了所有异常机制和样式,包括一些非常原始的异常机制和样式,还有一些异常机制和样式过于“可爱”。不过,有一些共同的原则:

首先,需要定义什么是异常。出于我们这里的目的,让我们假设它是一个与当前正在执行的代码相关的异常条件的通知(而不是当前代码未使用的I/O设备上的条件)。假设它是相对于当前执行的代码同步交付的,没有延迟(除了一些机器周期),也没有(最初)发送到不相关的代码

继续这种思路,我们假设当前执行的程序有一个(至少是概念上的)调用返回堆栈,表示从程序执行开始到异常点的调用嵌套顺序。由于是这种情况,并且由于异常与当前执行的代码“相关”(例如,被零除是由于当前过程中的除法操作),因此与调用返回堆栈中的每个过程同样存在排序关系。也就是说,每个过程“知道”该异常是由其自身的执行及其调用的过程直接或间接导致的

这是怎么说的?通常,最接近错误的过程(即位于调用返回堆栈“顶部”的过程)最“知道”错误的原因,并且最适合处理错误。但有时(例如,“未找到文件”异常)最靠近异常点执行的过程没有足够的知识来处理错误(因为,例如,它不知道调用者从哪里得到不存在的文件名,或者文件的内容应该表示什么)。因此,如果当前过程无法处理错误,它应该(隐式或显式地)将错误“重新签名”到调用过程(依此类推,直到找到要处理错误的过程为止)。大多数异常方案都会自动执行此“重新签名”,尽管有些异常方案需要程序员在一定程度上对其进行管理

最后,如果错误没有得到处理,您将进入调用返回堆栈的底部。这是默认处理程序接管并决定要做什么的时候(杀死程序,在代码中的某个“安全”重新启动点恢复,等等)。默认处理程序还可能尝试记录错误(以及调用返回堆栈内容),以便稍后对其进行调试

因此(由于您特定的操作环境,没有任何不需要的原因),处理异常的最佳方法是在最“了解”它们的含义的各个过程中。在某些情况下,过程可能只知道一般意义上的异常意味着什么(例如,出于某种原因,被零除意味着“无效权重”),因此它可能会使用新的程序定义的异常类型辞职,期望其调用方(或其调用方的调用方…)将“知道”什么是“无效权重”以及如何处理它

许多人认为,异常应该只用于处理“灾难性”错误,这些错误如果不是完全终止程序,至少会给用户带来严重的错误消息,但这种观点是错误的。使用异常来管理(比如)无效的用户输入是完全可以的,事实上,从“结构化编程”的角度来看,使用异常通常比使用返回码等更好。唯一需要注意的是,在某些环境中,异常非常缓慢,并且不应在异常可能频繁发生的地方使用。但大多数较新的环境更“开明”,在这些环境中可以使用例外情况