在try-catch或代码的特定部分中包装每个方法

我的高级同事告诉我在try-catch块中包装每个方法,以便他们可以跟踪发生exception的位置,以帮助更快地调试问题。 最好将Try Catch中的每个方法包装到这样:

Public int foo() { try { //do something }catch(Exeception ex) { //do something with ex } } 

或者在我认为可能发生的情况下捕捉exception会更好吗? 例如,对数组执行某些操作可能会导致发生IndexOutOfRangeException

 //wrap this in try catch int[] array = new int[3]; array[0] = 1; array[1] = 2; array[2] = 3; array[3] = 4; 

谢谢。

try块包含可能导致exception的受保护代码。 执行该块直到抛出exception或成功完成。

您可以查看我应该多久使用一次try和catch

捕获exception的基本经验法则是,当且仅当您有一种有意义的处理方式时才捕获exception。

如果您只是记录exception并将其抛出堆栈,请不要捕获exception。 它没有任何意义和杂乱的代码。

当您预计代码的特定部分出现故障时,如果您有后备备份,请捕获exception。

当然,您总是遇到需要使用try / catch块的已检查exception的情况,在这种情况下您没有其他选择。 即使检查了exception,也要确保正确记录并尽可能干净地处理。

最好在代码的关键部分使用它,然后:

 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); ServerForm form = new ServerForm(); Application.Run(form); } static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.Message, Program.Name); } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { MessageBox.Show((e.ExceptionObject as Exception).Message, Program.Name); } 

只是在未处理的exception情况下

使用Try catch块没有问题,因为它没有开销(除非你继续在任何地方添加它可能包括可读性开销),而且通常会为catch和finally块添加额外的IL,当没有抛出exception时,几乎没有行为上的差异。

但是,如果您的代码确实抛出exception,那么您就会遇到轻微的性能问题,因为在这种情况下必须创建exception,必须放置堆栈爬网标记,并且如果处理exception并访问其StackTrace属性,则堆栈遍历为发生。 因此,总是将代码包装在try catch块中可能不是一个好主意,或者你可以将它放在父级别,然后检查堆栈跟踪

使用try-catch在很大程度上取决于上下文。 对我来说,使用或不使用try catch块时没有规则告诉开发人员。

开发人员代码必须防止由于空参数或文件存在或数据一致性等上下文导致的明显错误或exception。 在开发许多其他程序使用的库的情况下,库只捕获一些关键exception,以允许顶级程序具有关于错误和exception的更多细节。

例如,我们在库中使用System.IO.File.WriteAllLines有一个方法。

 void bool DoSomethingWithFile() { try { // Some code here System.IO.File.WriteAllLines() //some code here return true; } catch() { LogExeption(); return false; } } 

如何告诉顶级程序PathTooLongException或者有一个安全exception,除非你在catch块中添加throw。

您认为可能发生错误的每一段代码都应该包含在try catch块中。 如果您正在处理一些实时问题和应用程序,您应该在任何地方使用它。 这是一个很好的编程实践。 如果您不知道可能发生什么exception,只需使用catch块来解决一般exception:

 try { //your code } catch (Exception ex) { //exception handling } 

或者您可以使用:

 try { //your code } catch { //your custom message }