我有一个 Java 程序可以解析几个不同的输入文件。即使在此输入文件中发现错误,解析仍然可以继续并收集其他几个错误。所以我想做的不是抛出异常并停止解析过程,而是想将异常注册到某个地方,然后继续解析并以类似的方式收集其他几个错误,最后我想检查是否报告任何错误,并根据此失败或继续。
当然,我总是可以通过编写 ExceptionRegister 或任何类来手动完成此操作,但我想知道两件事:
1)这种做法有问题吗?你知道我想做什么的替代设计吗?
2) 有没有标准的方法来做到这一点? (例如,如果可能的话,我想使用内置功能,而不是滚动我自己的类)
谢谢
编辑:我不知道为什么,但有人在我接受他的回答之前删除了他的回答。无论如何,我认为简单的数据结构应该可以工作。基本上,我将编写一个收集多个错误消息的异常类。然后我会调用它的 throw 方法,如果它至少注册了一条错误消息,它就会抛出自身。
EDIT2:这里有更多说明。我的问题与解析无关。解析只是一个例子,因为我的程序做了一些解析。想一想:我正在运行一个算法,如果出现错误,我可以继续该算法以收集更多错误,这样我就可以同时打印这两个错误,而不是打印一个错误,当它被修复时,打印第二个错误。
最佳答案
当您无法再处理输入时,确实应该使用异常。它们是特殊情况,您的代码说“我放弃了,我缺少一些信息,或者我不是为了这个”。这是关于如何定义此类情况的灰色地带,但通常的哲学是 Bill Venners 在 this (old!) article 中提出的。是:
Avoid using exceptions to indicate conditions that can reasonably be expected as part of the typical functioning of the method.
在你的情况下,听起来你必须解析的内容可能不正确,但这是你的程序所期望的,并且不会违反足够的契约(Contract)来停止解析。另一方面,例如,如果输入语法中的错误导致其余解释失败,则可以使用可接受的异常。
但是人们仍然使用异常,因为它们对于停止执行和向上堆栈非常方便,而无需处理处理返回结果的繁琐细节。但在它的对应物上,当您在某些对象中留下一些无人看管的状态时,它们可能会产生棘手的结果。
您的要求听起来更像是需要一种验证模式,而不是可能导致处理停止的单一异常。停止所有处理的一个异常:如果抛出一个,其余的将被忽略。但是你建议你收集它们而不是扔掉它们。所以我想说,在那种情况下,为什么要使用异常呢?看来您确实想要返回正确的结果而不是停止程序的执行。
因为如果您仍然沿着这条路走下去,您可能会在最后抛出一组异常。你扔哪个?在您创建的异常收集器中,哪个优先?
以 Eclipse 为例,它有一个巨大的平台来处理大量的集合插件贡献。他们使用适当的通信 channel 记录任何警告和错误,无论是在问题面板还是 through the execution of background task .后者的执行通常会返回 IStatus object。或变体。基于此 IStatus 对象,接收状态的代码决定对其采取行动。
因此,就个人而言,我会开发一个类似的对象来收集所有必要的用户错误(而不是程序错误),它不会破坏程序的执行和契约(Contract)的可接受部分。这个对象可以包含错误的严重性、它的来源、如何修复它的提示(这可以是一个字符串,或者甚至是一个包含用于显示错误或可能是部分自动修复的精确定位逻辑的方法)等。 .. 一旦执行完成,解析的结果将得到这些状态对象并对其进行操作。如果有错误,通过UI通知用户并记录。
所以它基本上与您最初建议的方法相同,减去异常并减去跳过堆栈的商品,这可能导致讨厌的副作用并且很难调试错误。
关于java - 是否有收集异常的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19871331/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife