是否有正确的方法来处理多个错误/异常



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

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

["名称太短"、"名称包含无效的unicode序列"、"姓名过长"]

现在,我应该使用一个异常数组(而不是抛出的异常)吗?

或者类似的东西更好:

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

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

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

提前感谢

不幸的是,许多语言和框架(包括C++、Java和.net)使用异常处理机制,该机制需要异常对象的类型来同时回答许多问题,包括:

  1. 发生了什么
  2. 除了堆叠展开之外,还需要采取哪些行动
  3. 在什么时候,系统应该被视为处于"已知"状态,至少在例外所表明的问题方面是这样

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

如果您可以控制所有可以抛出的异常,那么使用异常处理范式可能会有所帮助,其中异常处理对象包括虚拟IsResolved属性或方法,以及在异常需要作为T处理时返回TShouldCatchAs<T>属性或方法。这样的范例将能够顺利地处理异常发生的情况,同时从早期的异常中展开堆栈(现有异常和新异常将被封装到一个复合异常对象中,该对象的ShouldCatchAs属性将组合原始异常的属性,并且当两个原始异常的IsResolved属性都相同时,其IsResolved属性应仅返回true)。

我不知道如何将这种行为集成到现有的框架中,除非捕捉并包装所有不符合范式的异常,但也许未来的框架可以促进这些事情。

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

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

我有时会使用例外,在我执行许多操作的情况下,每一个操作都取决于前一个操作的成功与否。这使得代码更加简洁,没有用于错误检查的if。尽管如此,这并不是最需要关心的事情。主要是记录错误,并返回成功/失败。需要成功/失败,以便您可以决定是否以正常方式继续(例如不执行indended操作,因为读取大小可能会超出内存)。

两个更重要的注意事项:

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

2) 日志或报告必须易于查看,并在出现问题时告知您。否则,您可能会发现自己根本没有使用错误报告mechansim。

这对我来说是一个非常重要的课题,我相信这是软件工程中最重要的问题之一。你可以在我的网站上阅读更多关于它的信息

那么您不应该抛出Exceptions。

Exception适用于异常情况。在验证方法上发现的错误不被视为"异常",很明显会发生验证错误。

例如,异常情况是您尝试连接到数据库失败。

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

异常不用于验证,而是在执行过程中发生与预期不同的情况时创建的。这就是为什么不能同时创建多个异常,但可能会因为发生了其他异常而导致异常,这就是为什么它们可以有一个名为case的父异常。

相关内容

最新更新