有没有一种正确的方法来处理多个错误/异常?

时间:2012-12-15 17:01:14

标签: oop exception exception-handling

在OO编程中,是否存在一些关于处理多个错误的概念模式,想法?

例如,我有一个方法执行一些检查,并应为每个发现的错误返回错误消息

['名称太短','名称包含无效的unicode序列','名称太长']

现在,我应该使用一组异常(不抛出异常)吗?

或类似的东西更好:

class MyExceptionList extends Exception{
  public Void addException(Exception e){}
  public Array getExceptions(){}
}

这一论点背后的任何理论都将受到赞赏!

(这不是关于特定编程语言的请求,而是纯粹的理论编程语言)

提前谢谢

4 个答案:

答案 0 :(得分:1)

根据我多年的经验,处理错误最好通过在各个级别记录它们,并从函数返回true / false,表示成功/失败。

日志记录取决于实现。它可以是文件,内存,您可以记录消息,唯一数字等等,只要日志能够确定错误的确切位置。

我有时会使用异常,在我执行许多操作的情况下,每个操作都依赖于其前任的成功。这使得代码更清晰,没有if用于错误检查。然而,这不是主要关心的事情。主要是记录错误,并返回成功/失败。需要成功/失败,以便您可以决定是否继续正常方式(例如不执行入口操作,因为读取大小可能会超出内存)。

另外两个重要的注意事项:

1)你必须构建一个超级简单的API来报告(记录)你的消息,否则你会发现自己推迟了这个至关重要的事情,最终没有这样做。

2)必须轻松查看日志或报告,并告知您遇到的问题。否则,您可能会发现自己根本没有使用错误报告mechansim。

这对我来说是一个非常重要的主题,我相信它是软件工程中最重要的问题之一。您可以在我的website

上详细了解相关信息

答案 1 :(得分:1)

不幸的是,许多语言和框架(包括C ++,Java和.net)使用异常处理机制,该机制要求异常对象的 type 同时回答许多问题,包括:< / p>

  1. 发生了什么事
  2. 除了堆栈展开之外还需要采取什么操作
  3. 在什么时候应该认为系统处于“已知”状态,至少在例外情况下指出的问题。

不幸的是,虽然这些问题的答案有些相关,但它们实际上远非100%相关。不幸的是,假设异常的类型足以回答所有这些问题,这使得很难合理地处理许多情况。

如果您可以控制可以抛出的所有异常,那么使用异常处理范例可能会有所帮助,其中异常处理对象包含虚拟IsResolved属性或方法以及{{1如果异常需要作为ShouldCatchAs<T>处理,则返回T的属性或方法。这样的范例将能够平滑地处理在从先前的异常展开堆栈时发生异常的情况(现有异常和新异常将被包装到复合异常对象中,其T属性将组合它们的那些原始异常,其ShouldCatchAs属性只应在两个原始异常'IsResolved属性同样执行时返回true

我不知道将这种行为集成到现有框架中的任何方法,除非捕获并包装所有不符合范例的异常,但未来的框架可能会促进此类事情。

答案 2 :(得分:0)

你不应该抛出Exception

Exception适用于例外情况。验证方法中发现的错误不被视为“例外”,很明显会发生验证错误。

例外情况是指您尝试连接数据库失败,例如。

您应该将所有验证错误记录到数组中,然后对其进行格式化并根据需要显示它。

答案 3 :(得分:0)

异常不用于验证,它们旨在在执行期间发生与预期不同的事情时创建。这就是为什么你不能一次创建很多异常的原因,但是因为发生了一些其他异常而导致异常,这就是为什么他们可以有一个名为case的父异常。