如何使用try catch进行异常处理是最佳实践

在维护甚至声称自己是高级开发人员的同事的代码的同时,我经常看到以下代码:

try

{

//do something

}

catch

{

//Do nothing

}

或者有时他们将日志记录信息写入日志文件,例如以下代码try catch

try

{

//do some work

}

catch(Exception exception)

{

WriteException2LogFile(exception);

}

我只是想知道他们所做的是最佳做法吗?这让我感到困惑,因为在我的思考中,用户应该知道系统会发生什么。

请给我一些建议。

回答:

我的异常处理策略是:

  • 要通过钩住捕获 Application.ThreadException event,然后决定:

    • 对于UI应用程序:使用道歉消息将其弹出给用户(winforms)
    • 对于服务或控制台应用程序:将其记录到文件(服务或控制台)中

然后,我总是将 都包含在try/catch

  • Winforms基础结构触发的所有事件(加载,单击,SelectedChanged …)
  • 第三方组件触发的所有事件

然后我附上“ try / catch”

  • 所有 (IO操作,潜在的零除法计算…)。在这种情况下,我会抛出一个新事件ApplicationException("custom message", innerException)来跟踪实际发生的情况

另外,我会尽力 进行 。有以下例外情况:

  • 需要立即向用户显示
  • 需要一些额外的处理,以便在事情发生时将它们放在一起,以避免级联问题(即:finallyTreeView填充过程中将.EndUpdate放在该部分中)
  • 用户不在乎,但重要的是要知道发生了什么。所以我总是记录它们:

    • 在事件日志中
    • 或磁盘上的.log文件中

应用程序顶级错误处理程序中的 是一个好习惯。

我也强迫自己尝试:

  • 请记住, 。不必将异常处理程序放在各处。
  • 可重用或深度调用的函数不需要显示或记录异常:它们要么自动冒泡,要么在我的异常处理程序中随一些自定义消息重新抛出。

所以最后:

坏:

// DON'T DO THIS, ITS BAD

try

{

...

}

catch

{

// only air...

}

无用:

// DONT'T DO THIS, ITS USELESS

try

{

...

}

catch(Exception ex)

{

throw ex;

}

最终尝试而没有抓住是完全有效的:

try

{

listView1.BeginUpdate();

// If an exception occurs in the following code, then the finally will be executed

// and the exception will be thrown

...

}

finally

{

// I WANT THIS CODE TO RUN EVENTUALLY REGARDLESS AN EXCEPTION OCCURED OR NOT

listView1.EndUpdate();

}

我在最高层的工作:

// i.e When the user clicks on a button

try

{

...

}

catch(Exception ex)

{

ex.Log(); // Log exception

-- OR --

ex.Log().Display(); // Log exception, then show it to the user with apologies...

}

我在一些所谓的函数中所做的事情:

// Calculation module

try

{

...

}

catch(Exception ex)

{

// Add useful information to the exception

throw new ApplicationException("Something wrong happened in the calculation module :", ex);

}

// IO module

try

{

...

}

catch(Exception ex)

{

throw new ApplicationException(string.Format("I cannot write the file {0} to {1}", fileName, directoryName), ex);

}

异常处理(自定义异常)有很多工作要做,但是我尝试记住的那些规则对于我做的简单应用程序已经足够了。

这是扩展方法的示例,用于轻松处理捕获的异常。它们以一种可以链接在一起的方式实现,并且很容易添加您自己捕获的异常处理。

// Usage:

try

{

// boom

}

catch(Exception ex)

{

// Only log exception

ex.Log();

-- OR --

// Only display exception

ex.Display();

-- OR --

// Log, then display exception

ex.Log().Display();

-- OR --

// Add some user-friendly message to an exception

new ApplicationException("Unable to calculate !", ex).Log().Display();

}

// Extension methods

internal static Exception Log(this Exception ex)

{

File.AppendAllText("CaughtExceptions" + DateTime.Now.ToString("yyyy-MM-dd") + ".log", DateTime.Now.ToString("HH:mm:ss") + ": " + ex.Message + "\n" + ex.ToString() + "\n");

return ex;

}

internal static Exception Display(this Exception ex, string msg = null, MessageBoxImage img = MessageBoxImage.Error)

{

MessageBox.Show(msg ?? ex.Message, "", MessageBoxButton.OK, img);

return ex;

}

以上是 如何使用try catch进行异常处理是最佳实践 的全部内容, 来源链接: utcz.com/qa/421926.html

回到顶部