编程概念:抛出异常时应该怎么做?

时间:2010-04-08 16:21:46

标签: language-agnostic exception-handling error-handling

这并不特别适用于任何语言,但如果重要,我在Visual Studio 2008中使用VB.NET。

我似乎找不到任何关于这个主题的谷歌有用的东西,但我想知道什么是抛出和捕获异常时的常见做法,但由于它被抛出,应用程序无法继续运行。

例如,当无法找到文件或文件被视为损坏时,我的 FileLoader 类会抛出异常。该异常仅在类中抛出,并未真正处理。如果检测到错误,则抛出异常,并且抛出的任何函数基本上都退出。

因此,在尝试创建该对象或调用其中一个成员的代码中,我使用了Try ... Catch语句。但是,我想知道,当这个异常被捕获时甚至应该做什么?我的应用程序需要这些文件完好无损,如果不是,那么应用程序几乎没用。到目前为止,我只是弹出一个消息框告诉用户他们是一个错误并重新安装。我还能做些什么,或者更好的是,在这些情况下常见的做法是什么?

6 个答案:

答案 0 :(得分:3)

恕我直言,系统中存在以下类型的例外:

  1. 可恢复的异常 - 这些是系统可能遇到异常的情况,但可以默认为可以继续工作的状态&向用户显示一条消息,它可以继续使用默认选项,用户选择“继续”,“重试”或“取消”操作。

  2. 不可恢复的例外 - 这些是系统无法继续或有任何默认选项的情况。在这种情况下,需要用户干预。因此,系统向用户显示一条消息,正确指导需要对“重试”或“取消”操作的选项执行的操作

  3. 根据您遇到的异常类型,我希望这可能有用。

答案 1 :(得分:2)

通常的做法是处理您可以使用的异常,并传递(使用可选的日志记录)那些您不能的异常。如果你遇到了一个无法解决的问题,那么再试一次也不会有任何帮助,而且正确的反应就会停止。

答案 2 :(得分:2)

在您的情况下,我认为您正在做的事情 - 通过用户友好的消息向用户显示错误,然后退出操作 - 正是您应该做的。

我倾向于将异常分为两类:可以从中恢复的异常以及无法从中恢复的异常。显然,如果你可以在没有用户知道有错误的情况下从异常中恢复,那么这是最好的选择。但在某些情况下,应用程序无法继续前进,您需要以某种方式取消当前操作。

你的听起来不像是一个网络应用程序,但如果是这样的话,发生意外错误时向开发人员发送电子邮件通常很有帮助,这样开发人员就可以进行适当的更改。

另请注意,许多框架都可以捕获所有未捕获的异常,而无需将整个内容封装在Try Catch块中。例如,ASP.NET 3.5使用一个名为Global.asax的类来捕获所有异常。由于我们的应用程序是基于Web的,因此允许我们不希望通过此类路由的任何错误,并且我们可以向开发人员发送错误电子邮件并向用户显示相应的错误页面。虽然你可以自然地想到某个代码块中可能存在异常,但你可以把Try-Catch放在那个块周围,但是对于其他所有块,这都是有帮助的。

答案 3 :(得分:1)

这个具体的'问题'没有真正的一般答案,但这里有一些可能对你有帮助的评论。

  • 不要违反您的抽象 - 如果您的代码是在一个处理对象但下面使用SQL数据存储的图层中调用的,那么它不应该通过SQL异常

  • 不要丢失信息 - 有时候,人们会捕获异常,只是忽略它们或打印“出错了”等消息。如果没有足够的细节(在日志或屏幕上),您无法确定问题发生的位置/时间,并且可能需要花费很长时间进行调试。

  • 异常层次结构 - 这可能不适用于所有语言,但如果您可以分层次地构建异常并且可以捕获它们的树而不仅仅是单个,那么很多代码都会变得相当干净。

你的方法听起来不错。通知用户遇到致命错误并中止执行。借用Sunny的优秀答案,它是不可恢复的,因此您必须要求用户干预。就个人而言,我更喜欢警告并恢复默认或内部,如果可能的话,而不是崩溃并要求重新安装。

答案 4 :(得分:0)

在你的特殊情况下,这是唯一的出路。

在另一种情况......好吧,实际上取决于具体情况。

答案 5 :(得分:0)

我经常使用我开发的内部工具来遇到这种情况。我通常会像你一样处理它;向用户显示错误消息,然后让他们重试或退出。