Questions tagged «exception-handling»

异常是一种异常情况,需要偏离程序的正常流程。通常,异常不应导致完全失败,而应由异常处理程序来处理。异常处理是许多编程语言中的内置构造。通常,通过展开堆栈来处理异常,从而回滚到异常范围之外的已定义状态,然后调用处理程序块或例程。

5
尝试实际发生的情况{return x; }最后{x = null; }语句?
我在另一个问题中看到了这个技巧,并且想知道是否有人可以向我解释这在世界上是如何工作的? try { return x; } finally { x = null; } 我的意思是,该finally条款真正执行后的return声明?此代码的线程不安全性如何?您能想到可以通过此骇客完成的任何其他骇客try-finally吗?

10
如何使用ELMAH手动记录错误
是否可以使用ELMAH执行以下操作? logger.Log(" something"); 我正在做这样的事情: try { // Code that might throw an exception } catch(Exception ex) { // I need to log error here... } 因为已处理此异常,所以ELMAH不会自动记录该异常。

5
如何引发C ++异常
我对异常处理的理解很差(即,如何出于自身目的自定义throw,try,catch语句)。 例如,我定义了一个函数,如下所示: int compare(int a, int b){...} 我希望函数在a或b为负数时引发一些消息异常。 在函数的定义中应该如何处理?

11
在一个catch块中捕获多种异常类型
我想要一种更干净的方式来获得以下功能,AError并且BError可以一网打尽: try { /* something */ } catch( AError, BError $e ) { handler1( $e ) } catch( Exception $e ) { handler2( $e ) } 有什么办法吗?还是我必须分开抓住它们? AError并Berror具有一个共享的基类,但它们也与其他我要介绍的类型共享它handler2,所以我不能只抓住基类。

6
在WPF应用程序中全局捕获异常?
我们有一个WPF应用程序,其中的某些部分可能会在运行时引发异常。我想全局捕获任何未处理的异常并将它们记录下来,但是否则继续执行程序,就好像什么都没发生一样(有点像VB的那样On Error Resume Next)。 这在C#中可能吗?如果是这样,我到底需要在哪里放置异常处理代码? 目前,我看不到任何可以包裹try/的点,catch并且可以捕获所有可能发生的异常。即使那样,我仍然会因为捕获而留下任何已执行的内容。还是我在这里以错误的方向思考? ETA:因为下面的许多人指出:该应用程序不是用于控制核电厂的。如果它崩溃了,那没什么大不了的,但是大多数与UI相关的随机异常在使用它的上下文中是很麻烦的。有(并且可能仍然有)其中的一些,因为它使用了插件架构,并且可能会被其他人扩展(在这种情况下也是学生;因此,没有经验的开发人员能够编写完全无错误的代码)。 至于捕获的异常:我确实将它们记录到日志文件中,包括完整的堆栈跟踪。这就是整个练习的重点。只是为了反驳那些从字面上把我比作VB的OERN的人。 我知道盲目地忽略某些错误类别是危险的,并且可能会损坏我的应用程序实例。如前所述,该程序对任何人都不是关键任务。在他们的正确思想中,没有人会相信人类文明的生存。它只是一个用于测试某些设计方法的小工具。软件工程。 为了立即使用该应用程序,异常不会发生很多事情: 没有异常处理-错误对话框和应用程序退出。必须重复实验,尽管可能要对另一个主题进行。尚未记录任何错误,这是不幸的。 通用异常处理–良性错误被捕获,没有造成危害。从我们在开发过程中看到的所有错误来看,这应该是常见的情况。忽略这种错误不会立即产生后果;核心数据结构已经过充分测试,因此很容易幸免。 通用异常处理–严重的错误被困,可能在以后崩溃。这可能很少发生。到目前为止,我们从未见过。无论如何,都会记录该错误,并且崩溃是不可避免的。因此,这在概念上与第一种情况相似。除了我们有堆栈跟踪。在大多数情况下,用户甚至不会注意到。 至于程序生成的实验数据:严重的错误在最坏的情况下只会导致不记录任何数据。细微的改变几乎不可能改变实验结果。即使在这种情况下,如果结果看起来可疑,也会记录错误;如果这是一个总体异常值,仍然可以丢弃该数据点。 总结一下:是的,我认为自己至少仍然是部分理智的人,并且我不认为会导致程序运行必定完全有害的全局异常处理例程。如前所述,取决于应用程序,这样的决定可能是有效的。在这种情况下,它被认为是一个有效的决定,而不是胡说八道。对于任何其他应用程序,该决定可能看起来有所不同。但是请不要指责我或从事该项目的其他人可能因为我们无视错误而震惊了整个世界。 旁注:该应用程序只有一个用户。并不是像Windows或Office那样被成千上万的人所使用,因为在这种情况下,首先让用户冒起泡沫的成本已经完全不同了。




15
在Python的调用者线程中捕获线程的异常
我对Python和多线程编程非常陌生。基本上,我有一个脚本可以将文件复制到另一个位置。我希望将其放置在另一个线程中,以便可以输出....以指示脚本仍在运行。 我遇到的问题是,如果无法复制文件,它将引发异常。如果在主线程中运行,这没关系;但是,具有以下代码不起作用: try: threadClass = TheThread(param1, param2, etc.) threadClass.start() ##### **Exception takes place here** except: print "Caught an exception" 在线程类本身中,我试图重新引发异常,但是它不起作用。我已经看到这里的人问类似的问题,但是他们似乎都在做比我想做的事情更具体的事情(而且我不太了解所提供的解决方案)。我见过有人提到的用法sys.exc_info(),但是我不知道在哪里或如何使用它。 非常感谢所有帮助! 编辑:线程类的代码如下: class TheThread(threading.Thread): def __init__(self, sourceFolder, destFolder): threading.Thread.__init__(self) self.sourceFolder = sourceFolder self.destFolder = destFolder def run(self): try: shul.copytree(self.sourceFolder, self.destFolder) except: raise

7
Exception.Message与Exception.ToString()
我有正在记录的代码Exception.Message。但是,我读了一篇文章,指出最好使用Exception.ToString()。使用后者,您可以保留有关该错误的更多关键信息。 这是真的,继续所有代码记录Exception.Message是否安全? 我还在log4net上使用基于XML的布局。是否Exception.ToString()可能包含无效的XML字符,这可能会引起问题?

15
C ++显示堆栈异常跟踪
如果抛出异常,我想有一种向用户报告堆栈跟踪的方法。做这个的最好方式是什么?是否需要大量的额外代码? 回答问题: 我希望它可以携带。我希望弹出信息,因此如果出现错误,用户可以复制堆栈跟踪并通过电子邮件发送给我。

25
您如何实施重试捕获?
Try-catch旨在帮助处理异常。这意味着它将以某种方式帮助我们的系统更强大:尝试从意外事件中恢复。 我们怀疑执行和指令(发送消息)时可能会发生某些事情,因此将其包含在try中。如果发生了几乎不可预料的事情,我们可以采取一些措施:编写渔获物。我不认为我们打电话来只是记录异常。我认为catch块旨在为我们提供从错误中恢复的机会。 现在,假设我们从错误中恢复了,因为我们可以修复错误所在。重试可能是非常好的: try{ some_instruction(); } catch (NearlyUnexpectedException e){ fix_the_problem(); retry; } 这将很快陷入永恒的循环,但是假设fix_the_problem返回true,然后我们重试。鉴于Java中没有这样的东西,您将如何解决此问题?解决该问题的最佳设计代码是什么? 鉴于我已经知道我所要的东西并没有被Java直接支持,所以这就像一个哲学问题。

15
如何使用try catch进行异常处理是最佳实践
在维护甚至声称自己是高级开发人员的同事的代码的同时,我经常看到以下代码: try { //do something } catch { //Do nothing } 或者有时他们将日志记录信息写入日志文件,例如以下代码try catch块 try { //do some work } catch(Exception exception) { WriteException2LogFile(exception); } 我只是想知道他们所做的是最佳做法吗?这让我感到困惑,因为在我的思考中,用户应该知道系统会发生什么。 请给我一些建议。


20
为什么最终尝试{…} {…}好?尝试{…}抓住{}不好吗?
我见过有人说使用不带参数的catch是一种不好的形式,尤其是在该catch没有执行任何操作的情况下: StreamReader reader=new StreamReader("myfile.txt"); try { int i = 5 / 0; } catch // No args, so it will catch any exception {} reader.Close(); 但是,这被认为是很好的形式: StreamReader reader=new StreamReader("myfile.txt"); try { int i = 5 / 0; } finally // Will execute despite any exception { reader.Close(); } 据我所知,将清理代码放入finally块与将清理代码放入try..catch块之后的唯一区别是,如果您在try块中包含return语句(在这种情况下,最终的清理代码将运行,但是try..catch之后的代码不会)。 否则,最后有什么特别之处?

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.