试图把我的头绕在异常以及何时使用它们上

时间:2019-02-05 18:20:35

标签: c# exception

我对编码并不陌生,我已经做了很长时间了,在工作中我使用Java,所以当编译器告诉我时,我只是使用了try-catch块。在c#中,由于异常可能使编译器冒泡,因此编译器不会强制您使用它。我知道,当我可以从异常中恢复时,应该使用try-catch块,但是说实话,这对我没有多大帮助,因为我从不觉得需要使用它们。对于数据库,我只使用using语句,如果代码在Web Api中并且由于无法连接数据库而失败,它将自动返回500内部服务器错误,因此我实际上不需要执行任何操作。

我已经阅读了很多有关该主题的文章,但实际上无法考虑何时应该使用try-catch块而不是仅使用或不做任何事情,而且我知道这可能使我无法改进。

4 个答案:

答案 0 :(得分:0)

此答案并非一概而论。我将尝试显示一些示例。

记录

使用异常对于记录错误非常有用。完成日志记录后,您甚至可能想要重新抛出异常。了解什么异常被抛出,何时被抛出,多久发生一次……对于调试或改善代码库非常有用。

示例:

try
{
  DoThingThatFails();
}
catch (ExpectedException ex)
{
  LogException(ex, DateTime.Now);

  //rethrow the exception
  throw;
}

建立图书馆

这可以是内部或公共图书馆。异常是处理错误或不受支持的操作的好方法。假设您有一个需要接受字符串的类。它绝对需要传递一个有效的非空字符串。如果“图书馆”的用户(可能是您或其他人)传递了无效值(例如null),则可以引发异常。

示例:

class Example
{
  //name must be a valid, non-empty string
  public Example(string name)
  {
    if (String.IsNullOrEmpty(name))
      throw new InvalidOperationException("The name parameter was null or empty");

    //Initialize your new object
  }
}

答案 1 :(得分:0)

就我个人而言,我在编写的所有非平凡代码中都采用了try / catch。如果我要处理特定的异常,则为此添加一个catch块,如果我没有标准块,则使用该块可以传递我认为有用的信息。

不过,一般来讲,网络上有大量有关此主题的信息。我建议您阅读并确定哪种方法最适合您。

答案 2 :(得分:0)

using块不允许您从异常中恢复,而只是确保在发生未捕获的异常的情况下分配资源。对您来说,了解应用程序中的异常处理至关重要。您不需要捕获所有异常,但是至少应该在应用程序的入口点捕获异常,以防止崩溃。

让我们使用一个例子,因为这可以帮助我更好地理解概念。

想象一下,我们正在创建一个WPF应用程序,当用户按下一个按钮时,将提交数据库调用并返回一些资源。如果您的数据库由于某种原因而处于脱机状态,并且没有在try / catch中调用数据库,而是在using块中调用它,则该应用程序将崩溃,并给用户留下不好的印象,或者无法帮助您进行故障排除报告。如果我们在数据库调用周围引入try / catch,则可以更恰当地让用户知道该错误并处理我们的数据库问题。

try 
{
     //Some db access has failed
}
catch(DbOfflineException ex)
{ 
    // Show message box to user 
    // Notify IS DB Team about critical issue
    // Rethrow if our calling method also has a try catch
}
catch(Exception ex)
{
    // If the exception isn't of type DbOfflineException we
    // would get to this catch block and could handle differently
}

如果希望对DbOfflineExceptions或Generic Exceptions进行具体处理,也可以链接不同的异常类型。

查看本文以获取更多信息: https://docs.microsoft.com/en-us/dotnet/standard/exceptions/

答案 3 :(得分:0)

异常是一种将错误处理代码与业务逻辑代码分开的方法。在异常处理之前,在最坏的情况下,每个函数调用之后您都要进行错误处理,并检查返回值是否发生错误。这使代码不可读,您可以忘记检查错误代码。

在您的情况下,框架捕获所有异常并返回内部服务器错误。这是一般的异常处理。没关系,因此服务不会意外停止。但是我认为您需要了解有关该错误的一些信息并将其保存在日志文件中,或者必须通知用户更具体的信息以了解发生了哪些错误。这是应该使用异常处理的时候。