首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java --有没有收集异常的标准方法?

java --有没有收集异常的标准方法?
EN

Stack Overflow用户
提问于 2013-11-09 09:28:26
回答 2查看 5.7K关注 0票数 21

我有一个Java程序可以解析几个不同的输入文件。即使在此输入文件中发现错误,解析仍然可以继续并收集其他几个错误。所以我想做的不是抛出异常并停止解析过程,而是将异常注册到某个地方,然后继续解析,并以类似的方式收集其他几个错误,最后我想检查是否报告了任何错误,并根据此检查是否失败或继续。

当然,我总是可以通过编写ExceptionRegister或其他任何类来手动完成此操作,但我想知道两件事:

1)这种方法有问题吗?你知道我想要做的事情有什么替代设计吗?

2)有没有这样做的标准方法?(例如,如果可能的话,我想使用内置功能,而不是滚动我自己的类)

谢谢

编辑:我不知道为什么,但就在我接受他的答案之前,有人刚刚删除了他的答案。无论如何,我认为简单的数据结构应该可以工作。基本上,我将编写一个异常类来收集几条错误消息。然后,我将调用它的抛出方法,如果它至少注册了一条错误消息,它就会抛出自己。

EDIT2:这里有更多的澄清。我的问题与解析无关。解析只是一个例子,因为我的程序做了一些解析。想一想:我正在运行一个算法,在出现错误的情况下,我可以继续这个算法来收集更多的错误,这样就不需要打印一个错误,当它修复后,打印第二个错误,我可以一起打印这两个错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-09 10:18:50

当你不能再处理输入时,真的应该使用异常。它们是特殊的情况,你的代码会说“我放弃了,我遗漏了一些信息,或者我不是这个意思”。这是如何定义这类情况的灰色地带,但正如Bill Venners在this (old!) article中所说的,通常的哲学是:

避免使用异常来指示可以合理预期的条件,作为方法典型功能的一部分。

在您的例子中,您必须解析的内容听起来可能是不正确的,但这是您的程序所期望的,并且不会破坏足够多的约定来停止解析。另一方面,例如,如果输入语法中的错误导致解释的其余部分失败,则可以使用可接受的异常。

但人们仍然使用exception,因为它们对于停止执行和向上堆栈非常方便,而不会涉及流经结果返回的繁琐细节。但另一方面,它们可能会产生棘手的结果,因为您在某些对象中留下了一些无人值守的状态。

您的需求听起来更像是需要一个验证模式,而不是一个可能导致处理停止的单个异常。停止所有处理的一个异常:如果抛出一个异常,其余的将被忽略。但你建议你把它们收集起来而不是扔出去。所以我会说,在这种情况下,为什么要使用异常呢?看起来你确实想返回正确的结果,而不是停止程序的执行。

因为如果你仍然沿着这条路走下去,你可能会在最后抛出一系列异常。你投哪一个?在您创建的异常收集器中,哪一个具有优先权?

以Eclipse为例,它有一个庞大的平台来处理大量的集合插件。它们使用适当的通信通道来记录任何警告和错误,无论是在problems窗格中还是在through the execution of background task中。后者的执行通常会返回IStatus object或variant。基于此IStatus对象,接收状态的代码决定对其执行操作。

因此,就我个人而言,我会开发一个类似的对象,它将收集所有必要的用户错误(而不是程序的错误),它不会破坏程序的执行和合同中可接受的部分。这个对象可以包含错误的严重性,它的来源,关于如何修复它的提示(这可以是一个字符串,甚至是一个包含用于显示错误的精确定位逻辑或可能的部分自动修复的方法),等等。一旦执行完成,解析的结果将获得这些状态对象并对其执行操作。如果有错误,通过UI通知用户,并将其记录下来。

因此,它基本上与您最初建议的方法相同,去掉了异常,也去掉了跳转堆栈的商品,这可能会导致严重的副作用和非常难以调试的错误。

票数 6
EN

Stack Overflow用户

发布于 2013-11-09 09:56:47

我想我现在明白了。您实际上要做的是收集解析错误(您将其表示为异常),并继续解析当前输入文件。

没有标准的方法可以做到这一点:

“异常寄存器”实际上只不过是一个解析错误描述符列表……可能是一些解析器异常。如果您可以在适当的时间点捕获异常,那么将其添加到“寄存器”中是很容易的。

困难的部分是你没有谈到的功能:

  • 如何捕获错误的位置
  • 如何让解析器在遇到解析器错误时继续解析。

这些问题的解决方案取决于您是如何实现解析器的。

  • 如果您使用的是解析器生成器,则PGS文档很可能会解释如何实现此功能。
  • 如果您手动实现解析器,则需要使用自己的代码来跟踪错误位置并执行语法错误恢复。

基本上,我将编写一个异常类来收集几个错误消息。然后,我将调用它的抛出方法,如果它至少注册了一条错误消息,它就会抛出自己。

这听起来像是对异常的滥用。一个更好的想法是在列表中累积错误,然后在列表非空的情况下创建/抛出异常。如果希望避免重复代码,请在帮助器类中使用静态方法。

有条件地抛出自己的异常是(IMO)奇怪的!而且创建许多你不太可能抛出的异常可能是低效的。(根据JVM的不同,异常的代价通常是创建异常和捕获堆栈帧。费用可能会很高。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19871331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档