Questions tagged «exceptions»

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

9
我应该在遍历它们的方法中接受空集合吗?
我有一个方法,其中所有逻辑都在foreach循环内执行,该循环遍历该方法的参数: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } 在这种情况下,发送一个空集合会导致一个空集合,但是我想知道这是否不明智。 我的逻辑是,如果有人正在调用此方法,那么他们打算传入数据,并且只会在错误的情况下将空集合传递给我的方法。 我应该捕获此行为并抛出异常,还是返回空集合的最佳实践?

11
C ++在现实世界中有没有例外的情况?[关闭]
在何时使用C上的C和C上的C ++?有一个声明WRT。编码大小/ C ++异常: 杰里的答案(除其他外): (...)使用C ++生成真正微小的可执行文件往往会更加困难。对于非常小的系统,无论如何您几乎不会编写很多代码,而额外的(...) 我问为什么会这样,杰里对此回答: 最主要的是C ++包含了异常处理,这(至少通常是)为可执行文件的大小增加了一些最小值。大多数编译器将允许您禁用异常处理,但是当您执行此操作时,结果将不再是C ++。(...) 在技​​术的现实世界中,我对此并不怀疑。 因此,我有兴趣(纯粹出于好奇)从现实世界的示例中听到,在该示例中,一个项目选择C ++作为语言,然后选择禁用异常。(不仅在用户代码中“不使用”异常,而且在编译器中将其禁用,这样您就不能引发或捕获异常。)为什么一个项目选择这样做(仍然使用C ++而不是C,但是没有)例外)-(技术上的)原因是什么? 附录:对于那些希望详细说明答案的人,很高兴详细说明如何处理无例外的含义: STL集合(vector,...)无法正常工作(无法报告分配失败) new 不能扔 建设者不能失败
40 c++  exceptions 

7
为什么“对象引用未设置为对象的实例”不能告诉我们哪个对象?
我们正在启动一个系统,有时我们会收到NullReferenceException消息中著名的异常Object reference not set to an instance of an object。 但是,在一种有将近20个对象的方法中,记录一个对象为空的日志实际上根本没有用。这就像告诉您,当您是研讨会的安全人员时,100位参加者中的一个人是恐怖分子。真的对您毫无用处。如果要检测哪个人是威胁性的人,则应该获取更多信息。 同样,如果要删除该错误,则需要知道哪个对象为空。 现在,有些事情困扰了我几个月,这就是: .NET为什么不给我们名称或对象引用的类型(至少为null)?。它不能从反射或任何其他来源理解类型吗? 另外,了解哪个对象为空的最佳实践是什么?我们是否应该始终在这些上下文中手动测试对象的可空性并记录结果?有没有更好的办法? 更新: 异常The system cannot find the file specified具有相同的性质。在附加到进程并进行调试之前,您无法找到哪个文件。我猜这些类型的异常会变得更聪明。如果.NET可以告诉我们c:\temp.txt doesn't exist.而不是一般性消息,会更好吗?作为开发人员,我投赞成票。

4
使用断言还是引发异常?
通常,当我编写一个函数时,我想确保其输入有效,以便尽早检测到此类错误(我相信这些被称为前提条件)。当前提条件失败时,我总是抛出异常。但是我开始怀疑这是否是最佳做法,如果不是,则断言是否更合适。 所以我应该什么时候做:什么时候使用断言,什么时候抛出异常?



3
为实现未决但未计划抽象的方法引发NotImplementedError是常规的吗?
我喜欢为NotImplementedError我想实现的任何方法提出一个,但是我还没有去做。我可能已经有了部分实现,但是raise NotImplementedError()由于我还不喜欢它而在它前面加上了它。另一方面,我也喜欢遵守约定,因为这将使其他人更容易维护我的代码,并且约定可能存在是有充分理由的。 但是,NotImplementedError的Python文档指出: 此异常派生自RuntimeError。在用户定义的基类中,抽象方法要求派生类重写该方法时,应引发此异常。 这是比我描述的更为具体的正式用例。提出一个NotImplementedError简单的方法来简单地指出API的这一部分是否还在进行中,这是一种很好的传统样式吗?如果不是,是否有另一种标准化的方式表明这一点?

5
如何创建和执行例外合同?
我试图说服我的团队领导者允许在C ++中使用异常,而不是返回isSuccessful带有错误代码的布尔值或枚举。但是,我不能反驳他的批评。 考虑这个库: class OpenFileException() : public std::runtime_error { } void B(); void C(); /** Does blah and blah. */ void B() { // The developer of B() either forgot to handle C()'s exception or // chooses not to handle it and let it go up the stack. C(); }; …
33 c++  exceptions 

8
在这里抛出异常是一种反模式吗?
代码审查后,我刚刚讨论了设计选择。我想知道您的意见是什么。 有一个此类Preferences,它是键-值对的存储桶。空值是合法的(这很重要)。我们希望某些值可能尚未保存,并且我们希望通过在请求时使用预定义的默认值对其进行初始化来自动处理这些情况。 讨论的解决方案使用以下模式(注意:显然,这不是实际的代码-出于说明目的而进行了简化): public class Preferences { // null values are legal private Map<String, String> valuesFromDatabase; private static Map<String, String> defaultValues; class KeyNotFoundException extends Exception { } public String getByKey(String key) { try { return getValueByKey(key); } catch (KeyNotFoundException e) { String defaultValue = defaultValues.get(key); valuesFromDatabase.put(key, defaultvalue); return defaultValue; } …

3
错误处理注意事项
问题: 长期以来,我对这种exceptions机制感到担心,因为我觉得它并不能真正解决应有的问题。 要求:关于该主题的争论很长时间,而且大多数人都在努力比较exceptions和返回错误代码。这绝对不是这里的主题。 尝试定义错误,我同意Bjarne Stroustrup和Herb Sutter的CppCoreGuidelines 错误表示该功能无法实现其广告目的 要求:该exception机制是用于处理错误的语言语义。 要求:对我来说,没有“没有借口”的功能不能完成任务:要么我们错误地定义了前后条件,所以该功能无法确保结果,或者某些特殊情况对于花时间在开发上没有足够重要的意义。一个办法。考虑到IMO,常规代码和错误代码处理之间的区别(在实施之前)是非常主观的。 要求:使用异常指示何时不保留前置条件或后置条件是该exception机制的另一个目的,主要是用于调试目的。我的目标不是这里的用法exceptions。 在许多书籍,教程和其他资料中,它们倾向于将错误处理显示为一门相当客观的科学,可以解决这一问题,exceptions而您只需要catch它们具有强大的软件就可以从任何情况下恢复。但是,作为开发人员的几年时间使我从另一种方法来看问题: 程序员倾向于通过抛出异常来简化他们的任务,而这种特殊情况似乎太少而无法仔细实现。典型的情况是:内存不足问题,磁盘已满问题,文件损坏等,这可能就足够了,但并不总是从体系结构级别决定。 程序员往往不会仔细阅读有关库中异常的文档,并且通常不知道函数何时何地抛出。而且,即使他们知道了,他们也并没有真正管理它们。 程序员往往没有足够早地捕获异常,当他们捕获异常时,主要是记录并抛出更多异常。(请参阅第一点)。 这有两个结果: 经常发生的错误可以在开发的早期发现并进行调试(很好)。 罕见的异常无法管理,并且会使系统在用户家崩溃(带有一条漂亮的日志消息)。有时会报告错误,甚至不会报告。 考虑到这一点,海事组织错误机制的主要目的应该是: 在不管理某些特定情况的代码中使可见。 发生这种情况时,将问题运行时与相关代码(至少是调用方)进行通信。 提供恢复机制 exception语义作为错误处理机制的主要缺陷是IMO:很容易看到a throw在源代码中的位置,但是绝对不明显,通过查看声明来知道特定功能是否会抛出。这带来了我上面介绍的所有问题。 该语言不会像对语言的其他方面(例如强类型的变量)那样严格执行和检查错误代码 尝试解决方案 为了改善这一点,我开发了一个非常简单的错误处理系统,该系统试图使错误处理的重要性与普通代码相同。 这个想法是: 每个(相关)功能都接收到对success非常轻的对象的引用,并可能将其设置为错误状态。在保存文本错误之前,该对象非常轻。 如果提供的对象已经包含错误,则鼓励函数跳过其任务。 绝对不能覆盖错误。 完整的设计显然会全面考虑每个方面(约10页),以及如何将其应用于OOP。 Success该类的示例: class Success { public: enum SuccessStatus { ok = 0, // All is fine error = 1, // …

5
返回不良样式/危险后使用finally子句进行工作吗?
作为编写迭代器的一部分,我发现自己正在编写以下代码(剥离错误处理) public T next() { try { return next; } finally { next = fetcher.fetchNext(next); } } 发现它比阅读起来稍微容易一些 public T next() { T tmp = next; next = fetcher.fetchNext(next); return tmp; } 我知道这是一个简单的示例,在可读性方面的差异可能不会那么大,但我对这样的一般情况感兴趣:在没有涉及异常的情况下,使用try-finally是否不好?如果在简化代码时实际上是首选。 如果不好,为什么?风格,性能,陷阱...? 结论 谢谢大家的回答!我猜得出的结论(至少对我而言)是,如果第一个示例是通用模式,则它可能更具可读性,但事实并非如此。因此,使用超出其目的的构造所带来的混乱,以及可能造成混淆的异常流,将胜过任何简化。

7
如何处理未处理的异常?(终止应用程序与保持活动状态)
当桌面应用程序中发生未处理的异常时,最佳实践是什么? 我当时想向用户显示一条消息,以便他可以与支持人员联系。我建议用户重新启动应用程序,但不要强行执行。与此处讨论的内容类似:ux.stackexchange.com-处理意外的应用程序错误的最佳方法是什么? 该项目是.NET WPF应用程序,因此所描述的提案可能看起来像这样(请注意,这是一个简化的示例。可能有必要隐藏异常详细信息,直到用户单击“显示详细信息”并为轻松报告错误): public partial class App : Application { public App() { DispatcherUnhandledException += OnDispatcherUnhandledException; } private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { LogError(e.Exception); MessageBoxResult result = MessageBox.Show( $"Please help us fix it and contact support@example.com. Exception details: {e.Exception}" + "We recommend to restart the application. " + …

7
C ++程序是否应该捕获所有异常并防止异常冒泡过main()?
曾经有人告诉我,C ++程序最终应该捕获所有异常。当时给出的推理基本上是允许异常冒泡main()进入怪异的僵尸状态之外的程序。几年前有人告诉我,回想起来,我相信观察到的现象是由于有关项目中产生的异常大的堆芯产生了很长时间。 当时,这似乎很奇怪,但却令人信服。C ++应该“惩罚”程序员没有捕获所有异常完全是荒谬的,但是我面前的证据似乎支持了这一点。对于有问题的项目,引发未捕获异常的程序似乎确实进入了怪异的僵尸状态-或我怀疑是现在的原因,在意外的核心转储中的进程异常难以停止。 (对于任何想知道为什么这在当时不那么明显的人:该项目从多个进程的多个文件中生成了大量输出,这些输出有效地掩盖了任何形式的aborted (core dumped)消息,在这种情况下,对核心转储进行事后检查是没有必要的“这不是一项重要的调试技术,因此无需过多考虑核心转储。程序的问题通常不取决于寿命长的程序随时间推移从许多事件中累积的状态,而是取决于寿命短的程序的初始输入(< 1小时),因此使用来自调试版本或调试器的相同输入重新运行程序以获得更多信息更为实用。) 目前,我不确定仅出于防止异常离开的目的而捕获异常是否有任何主要的优点或缺点main()。 我可以想到的允许异常冒泡的小好处main()是,它会导致将结果std::exception::what()打印到终端上(至少使用Linux上的gcc编译程序)。另一方面,通过捕获所有派生自std::exception该异常的异常并打印结果来实现此目的很简单std::exception::what(),如果希望从非派生的异常中打印一条消息,std::exception则必须在离开之前对其进行捕获才能main()打印消息。 我可以想到的允许异常冒泡的适度缺点main()是,可能会生成不需要的核心转储。对于使用大量内存的过程而言,这可能会很麻烦,并且从程序控制核心转储行为需要特定于OS的函数调用。另一方面,如果需要核心转储和退出,则可以在任何时间通过调用来实现,而在std::abort()没有核心转储的情况下可以通过调用在任何时间实现std::exit()。 有趣的是,我认为我what(): ...在崩溃时从未见过由广泛分布的程序打印的默认消息。 支持或反对允许C ++异常冒出来的强有力的论据是什么(如果有)main()? 编辑:此站点上有很多常规异常处理问题。我的问题特别是关于无法处理的C ++异常,并使其一直存在main()-可能会显示错误消息,但这是立即显示的停止错误。
29 c++  exceptions 

7
使用异常作为工具尽早“捕获”错误是否可以?
我使用异常来尽早发现问题。例如: public int getAverageAge(Person p1, Person p2){ if(p1 == null || p2 == null) throw new IllegalArgumentException("One or more of input persons is null"). return (p1.getAge() + p2.getAge()) / 2; } 我的程序永远不要传递null此函数。我从来没有打算。但是,众所周知,编程中会发生意想不到的事情。 如果发生此问题,将引发异常,以便在导致程序其他位置出现更多问题之前,找出并修复该异常。异常会停止程序,并告诉我“这里发生了坏事,请修复它”。而不是null在程序周围四处走动,从而导致其他地方出现问题。 现在,您是对的,在这种情况下,这null将立即导致NullPointerException立马,所以它可能不是最佳示例。 但以这种方法为例: public void registerPerson(Person person){ persons.add(person); notifyRegisterObservers(person); // sends the person object to all kinds of …

12
有用的错误消息会给开发人员带来什么问题?[关闭]
至今令我震惊的是,在如今的今天,由专业团队开发的至今仍在使用多年的产品一直未能提供给用户有用的错误消息。在某些情况下,仅添加少量额外信息就可以节省用户数小时的麻烦。 产生错误的程序,是有原因的。它拥有一切可用的信息,可以尽一切可能地通知用户,为什么会失败。但是,提供信息以帮助用户的优先级较低。我认为这是一个巨大的失败。 一个示例来自SQL Server。当您尝试还原正在使用的数据库时,它绝对不会让您这样做。SQL Server 知道哪些进程和应用程序正在访问它。为什么它不能包含有关正在使用数据库的进程的信息?我知道并不是每个人都Applicatio_Name在其连接字符串上传递属性,但是即使是有关所涉及机器的提示也可能会有所帮助。 另一个选择,也是SQL Server(和mySQL)是可爱的string or binary data would be truncated错误消息和等效项。很多时候,只需仔细阅读生成的SQL语句,表格就会显示出哪一列是罪魁祸首。情况并非总是如此,如果数据库引擎发现了错误,为什么它不能节省我们的时间,而只是告诉我们那是该死的列呢?在此示例中,您可能认为检查它可能会对性能造成影响,并且这会妨碍编写者。好我买 怎么样,一旦数据库引擎知道存在错误,它就会在事后快速比较要存储的值和列的长度。然后将其显示给用户。 ASP.NET的可怕表适配器也很内gui。可以执行查询,并且可以显示一条错误消息,指出某处的约束已被违反。感谢那。是时候将我的数据模型与数据库进行比较了,因为开发人员太懒了,甚至无法提供行号或示例数据。(根据记录,我从来没有使用这种数据访问方法的选择,它只是我继承了一个项目!)。 每当我从C#或C ++代码中引发异常时,我都会将手边的一切提供给用户。已经决定扔掉它,所以我可以提供的信息越多越好。为什么我的函数抛出异常?传递了什么,期望什么?我只需要一点时间就可以在异常消息的正文中添加有意义的内容。地狱,它只是帮助我,而我发展,因为我知道我的代码抛出的事情,是有意义的。 有人可能会辩称,不应将复杂的异常消息显示给用户。虽然我不同意这一点,但是根据您的构建,通过使用不同级别的冗长程度可以轻松地解决这个问题。即使这样,ASP.NET和SQL Server的用户也不是您的典型用户,他们宁愿使用充满冗长和美味信息的内容,因为他们可以更快地查找问题。 在当今时代,为什么开发人员认为可以在出现错误时提供最少量的信息呢? 这是2011人,前来上。

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.