【问题标题】:ASP.NET - When to use custom exceptions?ASP.NET - 何时使用自定义异常?
【发布时间】:2010-09-06 19:03:40
【问题描述】:

嘿,我不断听到我应该始终在我的网络应用程序中使用自定义异常。问题是,当自定义异常都在 global.asax(写入数据库等)反正..那么我为什么要使用它们呢?

【问题讨论】:

    标签: c# asp.net exception


    【解决方案1】:

    我几乎从不使用自定义异常。当我手动抛出异常时,我会提供详细消息。

    我发现维护异常是不值得的。

    更新

    让我们把它放到上下文中。问题是是否有人应该在 Web 应用程序中创建自定义异常。我将其设想为一个基本的 crud 应用程序。

    网络应用程序

    在 Web 应用程序中,您几乎不需要自定义异常。正在将数据写入数据库,并且正在从数据库中读取数据。然后数据被某种 UI 消耗:MVC、WPF、WebForms 等。在这样的应用程序中,没有机会出现自定义异常。每个应用程序都是不同的,所以会有例外这...

    框架

    框架是完全不同的动物。作为框架开发人员,您的工作是提供对发生错误的原因的可见性。我期望来自框架的详细异常,也许是自定义的,也许不是。我希望有足够的信息来解决错误。

    正如@Wyatt Barnett 指出的那样,一个新的例外应该提供更多的东西,这是现有类无法做到的。

    我要创建自定义异常的原因

    1. 传达更详细和具体的信息 关于错误。
    2. 提供一种方法来捕获这种错误情况(即“FileNotFoundExeception”,这允许在更高层做出业务决策。)

    【讨论】:

    • @JohnIdol 在 Web 应用程序中创建自定义异常没有任何好处。在大多数情况下,异常被转储到附加到 HttpAppication 中的 OnError 事件的一些日志记录框架中。
    • 我不同意没有好处,但这不是我要问的。我看不到您在维护方面的观点,一旦您创建了自定义异常,它需要什么样的维护?
    • @JohnIdol 如果您认为它们适合您,请创建它们。我创建了它们,认为我在遵循“最佳实践”。他们挡路了。没有额外的价值——!oO!我有一个例外,有一个特殊的名字,很重要。最后,我删除了所有自定义类,并将它们替换为带有详细描述的“异常”。只是需要维护更多的课程。即使他们只是坐在那里。我还是得看看他们。
    • 我发现的良好做法是为 Web 应用程序提供一个特定于应用程序的自定义异常,从而明确异常是从应用程序还是从框架/库/平台引发的。
    • @Yarin 这是个好主意。否则,您将在堆栈跟踪中挖掘以寻找起始点。
    【解决方案2】:

    我认为创建自己的自定义异常而不是仅仅使用带有描述性错误的标准类型异常成为一个好主意的地方出现在您需要向异常添加更多数据的地方。 EG,想象一下你有一个导入例程,而不是在收到损坏的数据时抛出 InvalidOperationException,你可以抛出 ImporterException 并在所述异常中包含导入的行号和原始数据?

    【讨论】:

    • 啊,所以对于简单的事情,比如检查用户篡改并在 true 时抛出异常应该只是一个普通的 ArgumentException,因为不需要额外的参数?
    • 1+ 这是一个公平的描述。
    【解决方案3】:

    让我们分解一下异常的使用:

    当我们的例程遇到这种情况时,我们会抛出异常:

    “我无法继续”

    当我们的例程遇到这种情况时,我们会抛出一个特定的 BCL 异常:

    “我无法继续,其中一种更具体的 BCL 异常类型描述了确切原因(即 FileNotFoundException)”

    当我们的例程遇到这种情况时,我们会抛出一个自定义异常类型:

    “我无法继续,因为 BCL 异常无法准确地向相关方描述”

    【讨论】:

      【解决方案4】:

      为给定的异常或问题设置适当的异常类对于将使用您正在编写的类的代码非常重要。

      例如,TextWriterWriteLine 方法可以抛出以下异常:

      ArgumentNullException
      ObjectDisposedException
      IOException
      FormatException
      

      想象一下你的代码,如果那个方法只抛出Exception

      【讨论】:

      • 好吧,鉴于 OP 的描述,我想他不会做任何不同的事情,并且会仍然让全局异常处理程序处理它。仅当您出于控制流原因计划捕获它们时,类型化异常才有用。有些人出于各种原因选择从不这样做。
      • 假设我们有 2 个可以抛出 FormatException 的类 - 那么是否应该有 2 个不同的 try/catch 块? - 没有看到自定义异常的任何原因.. 仅当我计划针对异常的特定错误页面时。
      • 柯克评论有效。当您认为它将为阶级消费者提供价值时,您必须这样做。例如,解析文件的类显然需要它自己的 ParsingException 对象。关于您的问题 user407674,当一个方法可以抛出多个异常时,只需为每个异常添加一个 catch 块,然后尝试一次。这是一个例子:functionx.com/csharp1/examples/multiexceptions.htm
      • 为什么解析文件的类需要自己的 ParsingException 对象?
      • 首先作为解析异常被捕获。我还添加了一个成员,其中包含导致问题的行以供进一步处理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多