发布于 2026-01-06 15 阅读
0

C# 中错误处理的 5 个良好实践

C# 中错误处理的 5 个良好实践

防止程序或应用出现错误的最佳方法是避免处理代码中可能出现的错误。如果能避免这些错误,就无需在错误发生时进行检查和处理,对吧?

理论上听起来不错,但完全避免错误发生并非总是可能的;否则,程序或应用根本就无法运行!当错误发生且程序无法自行恢复时,如何处理该错误取决于错误信息中包含了多少关于错误原因和问题发生位置的信息。

因此,我决定介绍5 种简单而实用的 C# 错误处理方法。


了解错误处理的概念

首先,必须理解错误处理的含义错误处理是指软件应用程序在发生错误时的响应和恢复机制。也就是说,它是一个准确预测检测解决应用程序、程序或通信中错误的流程。

通过错误处理,可以更轻松地维护程序的正常执行流程。然而,在错误处理方法方面,许多应用程序确实会遇到一系列架构问题。

🧠记住:抛出的错误是好事。


始终保留异常堆栈的跟踪信息。

使用throw e;`this.exception` 来抛出捕获到的异常并不是一个好方法,因为 C# 允许我们使用 ` throw;this.exception` 在 catch 块中抛出异常。

这样我们就可以跟踪堆栈,并更好地了解异常情况。

糟糕的方式:

try
{
    FunctionThatMightThrow();
}
catch (Exception ex)
{
    logger.LogInfo(ex);
    throw ex;
}
Enter fullscreen mode Exit fullscreen mode

好方法:

try
{
    FunctionThatMightThrow();
}
catch (Exception error)
{
    logger.LogInfo(error);
    throw;
}
Enter fullscreen mode Exit fullscreen mode

在异常中包含信息是一种良好的做法,因为它有助于错误调试。另一方面,如果目标是记录异常,则应使用 throw 语句将问题转嫁给调用者。


避免使用“甩掉前任”

乍一看,任何开发者都可能认为这throw ex是捕获异常后重新抛出异常的最佳方法。没错,这确实是一种简单的方法,但并非正确的方法。这种方法不好,因为你会丢失堆栈跟踪信息

糟糕的方式:

try
{
    // Do something..
}
catch (Exception ex)
{
    // Any action something like roll-back or logging etc.
    throw ex;
}
Enter fullscreen mode Exit fullscreen mode

好方法:

try
{
    // Do something..
}
catch (Exception ex)
{
    // Any action something like roll-back or logging etc.
    throw;
}
Enter fullscreen mode Exit fullscreen mode

我们可以看到,我采用的正确方法是直接使用 ` throw.`。这样,原始异常堆栈就能被保留下来。否则,使用 ` throw ex.`,它会被调用该语句的代码行覆盖。


避免使用 if 条件

如果需要根据异常类型执行不同的操作,则应考虑使用多个 catch 代码块进行异常处理。使用if条件语句是一种不好的做法。 

糟糕的方式:

try
{
    // Do something..
}
catch (Exception ex)
{
    if (ex is TaskSchedulerException)
    {
        // Take action
    }
    else if (ex is TaskCanceledException)
    {
        // Take action
    }
}
Enter fullscreen mode Exit fullscreen mode

好方法:

try
{
    // Do something..
}
catch (TaskCanceledException ex)
{
    // Take action 
}
catch (TaskSchedulerException ex)
{
    // Take action
}
Enter fullscreen mode Exit fullscreen mode

即使我们创建了多个 catch 块,也始终建议创建一个包含 Exception 参数的 catch 块作为最后一个 catch 块。它提供了一个辅助 catch 块。


务必分析已发现的错误。

如果发现错误,忽略它、放任不管是没有意义的,因为你没有机会去修复它或采取任何措施。

如果你知道可能会发生错误,最好将代码放在 try/catch 语句块中。

糟糕的方式:

try
{
    FunctionThatMightThrow();
}
catch (Exception ex)
{
    // silent exception
}
Enter fullscreen mode Exit fullscreen mode

好方法:

try
{
    FunctionThatMightThrow();
}
catch (Exception error)
{
    NotifyUserOfError(error);
    // Another option
    ReportErrorToService(error);
}
Enter fullscreen mode Exit fullscreen mode

正如我们所见,抛出错误并不是一个好办法,因为它可能会淹没在控制台输出的大量信息中。通过将其包裹在 try/catch 语句中,我们可以在之后(如果发生错误)制定一个处理计划或预先编写好相应的代码路径。


这些技巧改编自《代码整洁之道》(Clean Code Javascript)。感谢Ryan McDermott 的精彩贡献!

文章来源:https://dev.to/bytehide/5-good-practices-for-error-handling-in-c-4391