Questions tagged «exceptions»

例外是在应用程序过程中发生,需要偏离程序的正常流程。

5
复杂软件应实现多少冗余/鲁棒性?
这个问题的焦点:尽管软件中存在一个或多个内部错误,某些软件执行“额外工作”以增加“最终成功/令人满意”结果的机会,当这些错误发生时,这需要更长的执行时间。如果结果成功,所有这些都会在用户不知情的情况下发生。 复杂软件的定义: 包含超过10个开发人员在其生命周期内编写的代码(由其提供),并且未在同一时间段内编写 依赖于10多个外部库,每个库都带有警告 典型的软件任务(用于生成用户想要的结果)需要10个或更多输入参数,其中大多数具有默认值,但如果用户需要控制,则可以配置。 最重要的是,相对于要执行的任务具有适当复杂性的软件,即不必造成不必要的复杂性。 编辑:什么是复杂的?请参阅复杂和复杂之间有很大的区别。(直接链接) 此问题内的冗余/鲁棒性的定义:(基于注释增加了鲁棒性) 如果在使用当前参数集时软件任务失败,请尝试其他参数。 显然,必须有内部知识,这些“不同”的参数使用不同的代码路径,可能会导致不同的(希望更好)结果。 有时,这些不同的代码路径是基于对外部库的观察而选择的。 最后,如果执行的实际任务与用户的说明略有不同,则用户将收到详细说明差异的报告。 最后,像10余个可配置参数一样,冗余和报告也是可配置的。 此类软件的示例: 数据库迁移 业务数据库 源代码控制数据库等 在Word文档和OpenOffice文档,PowerPoint和OpenOffice Draw等之间进行批量转换。 自动翻译整个网站 自动分析软件包,例如Doxygen,但需要更可靠的分析(即不仅仅是文档工具) 网络通信,其中数据包可能会丢失并且可能会重试 这个问题最初是由您如何处理故意的不良代码启发而来的?但现在仅关注软件膨胀的原因之一。这个问题没有解决软件膨胀的任何其他原因,例如添加新功能。 可能相关: 如何处理(巨大)项目中的复杂代码 人们如何管理和维护极其复杂且难以阅读的代码?

3
异常或错误代码
我们正在构建一个Web服务(SOAP,.Net),该服务将与(大多数)本地客户端(Windows,C ++)进行通信,并且我们想知道将错误传达给客户端的最佳方法是什么(例如,不提供登录服务的SomethingBadHappened或类似未找到用户的内容),并且无法决定是向客户端抛出异常还是使用某种错误代码模型来执行上述操作。 您希望在客户端上进行处理的是:接收错误代码或处理包含错误原因的ServerFault异常? 1)我们为什么想例外:因为它将使服务器端代码有很多更均匀 2)为什么我们都在思考错误代码:因为我们认为它使从客户端的角度更有意义。 如果2)确实是真的,我们可能会想使用错误代码而不是异常代码?是这样吗? 另外,如果我们与托管客户而不是本地客户进行交谈,答案是否会改变?

5
在Java应用程序中引发运行时异常
我是承包商,以技术负责人的身份为我的客户设计企业Java应用程序。该应用程序将由最终用户使用,当我们离开时,将有一个支持团队为该应用程序提供支持。 与我一起工作的其他技术负责人给人的印象是异常处理会使代码变脏。系统应仅从服务层引发检查的异常,而其余代码应从所有其他层引发运行时异常,因此无需处理未检查的异常。 在业务应用程序中抛出未经检查的异常有什么需要? 根据我过去有关运行时异常的经验: 1)未经检查的异常使代码不可预测,因为它们甚至在Javadoc中也不会显示。 2)在业务应用程序中抛出未经检查的异常是没有意义的,因为当您将其抛出并直接出现在用户脸上时,您如何向用户解释?我已经看过足够多的Web应用程序,500 -Internal Error. Contact Administrator它对最终用户或管理该应用程序的支持团队没有任何意义。 3)引发运行时异常会强制引发异常的类的用户遍历源代码以进行调试,并查看引发异常的原因。只有在很好地记录了运行时异常的Javadoc的情况下,才可以避免这种情况,而我发现这种情况永远不会发生。

5
如何设计例外
我正在努力解决一个非常简单的问题: 我现在正在服务器应用程序上工作,我需要为异常创建一个层次结构(某些异常已经存在,但是需要一个通用框架)。我什至如何开始这样做? 我正在考虑遵循以下策略: 1)出了什么问题? 有人问,这是不允许的。 要求进行某些操作,这是允许的,但由于参数错误而无法使用。 有人问,这是允许的,但是由于内部错误,它不起作用。 2)谁在发起请求? 客户端应用 另一个服务器应用程序 3)消息处理:在处理服务器应用程序时,这全都与接收和发送消息有关。那么,如果发送消息出错了怎么办? 这样,我们可能会得到以下异常类型: ServerNotAllowedException ClientNotAllowedException ServerParameterException ClientParameterException InternalException(如果服务器不知道请求来自何处) ServerInternalException ClientInternalException MessageHandlingException 这是定义异常层次结构的非常通用的方法,但恐怕我可能缺少一些明显的案例。您是否对我不涉及的领域有想法,是否知道此方法的任何缺点,或者是否有更一般的方法来解决此类问题(在后一种情况下,在哪里可以找到它)? 提前致谢
11 design  c++  exceptions  stl 


10
安全限制是否应导致服务返回null或引发异常?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我在这个问题上与经验丰富的开发人员有些分歧,想知道其他人对此有何看法?我们的环境是Java,EJB 3,服务等。 我编写的代码调用服务来获取事物和创建事物。我遇到的问题是我得到了没有意义的空指针异常。例如,当我要求服务创建一个对象时,我得到空值。当我尝试查找具有已知有效ID的对象时,返回空值。我花了一些时间试图弄清楚代码中的错误。因为我经验不足,所以我通常以为我做错了什么,但是事实证明,返回null的原因是安全性。如果使用我的服务的用户主体对目标服务没有正确的权限,则它仅返回null。这里大多数其他服务的记录也不太好,因此显然这只是您必须了解的内容。 当开发人员编写与服务交互的代码时,这相当令人困惑。如果服务有一个异常,该异常将告诉我用户没有适当的权限来加载此事物或创建该事物,这对我而言将更为有意义。然后,我会立即知道为什么我的服务无法按预期工作。 编写该服务的经验更丰富的开发人员认为,索要数据不是错误条件,并且仅应在错误条件下引发异常,而不是在用户无法访问数据时抛出异常。通常会在GUI中查找这些数据,对于没有正确权限的用户,这些事情简直“不存在”。简而言之:问是没有错的,因此也不例外。Get方法返回null,因为对那些用户来说那些“不存在”的东西。当不允许用户创建东西时,Create方法返回null。 这是正常的和/或良好的做法吗?我更喜欢使用异常,因为我发现更容易知道发生了什么。因此,例如,如果您请求一个具有无效ID的对象,则我宁愿抛出NotFoundException,而不是返回null。


2
在并行程序中处理错误的最佳方法是什么?
随着并行算法的出现,现在可能是考虑错误处理的好时机。 所以起初有错误代码。那些很烂。可以随意忽略它们,因此您可能会迟到并产生难以调试的代码。 然后是例外。这些问题一旦发生就变得不可忽视,而且大多数人(乔尔除外)更喜欢他们。 现在我们有了帮助并行代码的库。问题是,您无法像使用非并行代码那样轻松地处理并行代码中的异常。如果异步启动任务并引发异常,则没有堆栈跟踪可以展开。最好的办法是捕获它并将其注册在任务对象上(如果有)。但是,它破坏了异常的主要优势:您必须检查它们,并且可以不加任何考虑地忽略它们,而在单线程代码中,异常必然会触发适当的操作(即使这意味着终止程序)。 语言实现或库应如何支持并行代码中的错误?

3
在代码中使用抑制警告是一种好习惯吗?
我用@SuppressWarnings("unchecked")与@SuppressWarnings("null")大多上面的方法,让没有任何警告的代码编译,但我有我的怀疑。找到了这个Stackoverflow 问题。乔恩·斯基特(Jon Skeet)为此回答了一个有趣的答案。 据他介绍, 有时Java泛型只是不允许您做您想做的事情,您需要有效地告诉编译器在执行时所做的事情实际上是合法的。 但是,如果有机会引发异常该怎么办?那抑制警告不是一个坏主意吗?我是否应该知道可能出现问题的地方? 另外,如果其他人稍后修改了我的代码并添加了一些可疑的功能却又没有删除SuppressWarnings,该怎么办?如何避免和/或有其他替代方法? 我应该使用@SuppressWarnings("unchecked")和@SuppressWarnings("null")吗? 更新#1 对于未检查的类型强制转换,根据此答案(由@gnat在下面的注释中指出),有必要抑制这些警告。 许多必不可少的Java库从未进行过更新,以消除对不安全类型转换的需求。抑制这些警告是必要的,以便其他更重要的警告将被注意到并得到纠正。 在禁止其他警告的情况下,仍在灰色区域中。 更新#2 根据Oracle文档(以下一些答案也提到): 作为样式问题,程序员应始终在最有效嵌套的最深层元素上使用此注释。如果要在特定方法中禁止显示警告,则应注释该方法而不是其类。

2
为什么在Oracle Java教程中将检查与未检查的异常称为“争议”?
我是Java新手,正在阅读有关异常的文档。,尤其是“ 未经检查的异常”-“争议”页面。 底线是: 如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。 我不明白这篇文章。什么是“争议”?你能用简单的话来解释吗?

1
什么时候应该在Python中继承异常?
在我的代码中,大约有七个地方会引发异常。所有这些异常的处理方式相同:将错误输出到日志文件,将软件状态恢复为默认状态并退出。 在代码审查期间,我非常重视的高级工程师说,我应该将所有这些异常归为一类。他的论点是,将来我们可能希望以不同的方式处理异常,这将更加容易。 我的观点是当前它只会使我们的代码混乱,并且由于我们不知道我们是否会以不同的方式处理异常,因此我们应该将代码保持简洁,并且如果时间到了,那么我们应该将其子类型化。 我想听听每种情况的论点。

2
JVM如何处理main方法抛出的异常?
我了解异常,将其抛出,处理它们,并将其传播到调用堆栈中较低的方法(即throws)。 我不明白的是: public static void main(String[] args) throws Exception { ... } 现在,我假设在main抛出的情况下,ExceptionJVM将对其进行处理(对吗?)。如果是这样,那么我的问题是: JVM如何处理引发的异常main?它有什么作用?
10 java  exceptions  jvm 

5
断言是异常还是错误?
我是一名专业的C程序员,也是一名业余爱好者Obj-C程序员(OS X)。最近,由于语法非常丰富,我很想扩展到C ++。 到目前为止,我对异常的处理还不多。Objective-C有它们,但是苹果公​​司的政策非常严格: 重要说明:您应保留使用编程异常或意外运行时错误(例如,超出范围的集合访问权限,尝试使不可变对象发生突变,发送无效消息以及失去与窗口服务器的连接)的例外情况。 C ++似乎更喜欢使用异常。例如,如果无法打开文件,RAII上的Wikipedia示例将引发异常。Objective-C会return nil因out参数发送错误而导致错误。值得注意的是,似乎std :: ofstream可以设置任何一种方式。 在程序员上我发现了几个答案,要么宣称使用异常代替错误代码,要么根本不使用异常。前者似乎更为普遍。 我还没有发现有人对C ++做过客观的研究。在我看来,由于指针很少使用,因此如果我选择避免异常,则必须使用内部错误标志。它会处理起来太麻烦,还是会比异常情况做得更好?两种情况的比较将是最佳答案。 编辑:虽然不完全相关,但我可能应该澄清一下nil。从技术上讲,它与相同NULL,但事实是,可以向发送消息nil。所以你可以做类似的事情 NSError *err = nil; id obj = [NSFileHandle fileHandleForReadingFromURL:myurl error:&err]; [obj retain]; 即使第一个电话返回nil。而且,就像您*obj在Obj-C中从未做过的那样,没有空指针取消引用的风险。
10 c++  exceptions 

5
在同一函数/方法中引发和捕获异常
我编写了一个函数,要求用户输入,直到用户输入正整数(自然数)。有人说我不应该在函数中抛出并捕获异常,而应该让函数的调用者来处理它们。 我不知道其他开发人员对此有何看法。我也可能在函数中滥用异常。这是Java中的代码: private static int sideInput() { int side = 0; String input; Scanner scanner = new Scanner(System.in); do { System.out.print("Side length: "); input = scanner.nextLine(); try { side = Integer.parseInt(input); if (side <= 0) { // probably a misuse of exceptions throw new NumberFormatException(); } } catch (NumberFormatException numFormExc) …
10 exceptions 

5
检查与未检查与异常……相反信念的最佳实践
系统正确传达和处理异常有很多要求。还有多种语言可供选择以实现这一概念。 例外要求(无特定顺序): 文档:一种语言应具有文档API可能引发的异常的含义。理想情况下,此文档介质应可在机器上使用,以允许编译器和IDE为程序员提供支持。 传输异常情况:显然,这允许功能传达阻止被调用功能执行预期动作的情况。我认为这类情况分为三大类: 2.1代码中的错误导致某些数据无效。 2.2配置或其他外部资源问题。 2.3本质上不可靠的资源(网络,文件系统,数据库,最终用户等)。这些有点极端,因为它们不可靠的本性应该让我们期待它们的零星失败。在这种情况下,是否将这些情况视为例外? 为代码提供足够的信息来处理它:异常应向被调用者提供足够的信息,以便被调用者可以做出反应并可能处理这种情况。这些信息也应该足够,以便在记录该异常时将为程序员提供足够的上下文,以识别和隔离有问题的语句并提供解决方案。 向程序员提供有关其代码执行状态的当前状态的信心:软件系统的异常处理能力应足够强,以提供所需的防护措施,同时又不影响程序员,因此他可以专注于执行以下任务:手。 为涵盖这些内容,以下方法已以多种语言实现: 受检查的异常 提供了记录异常的好方法,并且从理论上讲,如果正确实施,应该可以确保一切都很好。但是,这样做的代价是,许多人认为通过吞下异常或将它们作为未检查的异常重新抛出来绕过它更具生产力。如果使用了不适当的检查异常,则几乎失去了它的全部用处。同样,检查异常使创建时间稳定的API变得困难。在特定域内实现通用系统将带来特殊情况的负担,这些特殊情况将变得难以使用单独检查的异常来维护。 未检查的异常 -比检查的异常通用得多,它们无法正确记录给定实现的可能异常情况。他们完全依赖临时文档。这就造成了一种情况,即介质的不可靠特性被提供可靠性外观的API所掩盖。同样,当抛出这些异常时,它们会在抽象层中向上移动,从而失去其含义。由于它们的文献记录不充分,因此程序员无法专门针对它们,并且经常需要投放比必要范围更广的网络,以确保辅助系统(如果发生故障)不会导致整个系统崩溃。这使我们又回到了吞咽问题检查提供的异常。 多状态返回类型 在这里,它依赖于不相交的集合,元组或其他类似的概念来返回预期结果或代表异常的对象。这里没有堆栈展开,没有代码切入,一切正常执行,但是必须在继续之前验证返回值是否存在错误。我还没有真正使用它,因此无法从经验中发表评论,我承认它解决了绕过正常流程的异常的一些问题,但是仍然会遇到与已检查的异常几乎相同的问题,既麻烦又不断地“面对您”。 所以问题是: 您在这方面的经验是什么?根据您的看法,您是为语言提供良好的异常处理系统的最佳人选? 编辑:写完这个问题后几分钟,我遇到了这个帖子,怪异的!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.