Questions tagged «error-handling»

与处理错误和异常有关的问题。根据Wikipedia的说法,异常处理是在计算过程中对异常(例如异常或需要特殊处理的异常事件)的发生做出响应的过程,通常会改变程序的正常执行流程。它是由专门的编程语言构造或计算机硬件机制提供的。

11
执行错误处理的现代方法…
我已经思考了一段时间了,发现自己不断发现警告和矛盾,因此我希望有人可以得出以下结论: 优先于错误代码的异常 据我所知,在从事该行业工作四年,阅读书籍和博客等之后,当前处理错误的最佳实践是抛出异常,而不是返回错误代码(不一定返回错误代码,而是返回错误代码)。类型代表错误)。 但是-对我来说这似乎是矛盾的... 编码接口,而不是实现 我们对接口或抽象进行编码以减少耦合。我们不知道或不想知道接口的特定类型和实现。那么,我们怎么可能知道应该寻找哪些异常呢?该实现可以抛出10个不同的异常,也可以不抛出任何异常。当我们确实捕获到异常时,我们正在对实现进行假设? 除非-接口具有... 异常规格 某些语言允许开发人员声明某些方法会引发某些异常(例如,Java使用throws关键字。)从调用代码的角度来看,这似乎很好-我们明确知道可能需要捕获哪些异常。 但是-这似乎表明... 泄漏抽象 为什么接口应该指定可以引发哪些异常?如果实现不需要引发异常或引发其他异常怎么办?在接口级别,无法知道实现可能要抛出的异常。 所以... 总结一下 当异常(在我看来)与软件最佳实践相矛盾时,为什么还要优先考虑它们?而且,如果错误代码非常糟糕(并且我不需要在错误代码的恶习上卖掉),还有其他选择吗?满足(如上所述)最佳实践要求但不依赖于调用代码检查错误代码返回值的错误处理技术的当前(或即将成为最新技术)是什么?

14
为什么0为假?
这个问题听起来很愚蠢,但是为什么大多数编程语言都将0求值false和其他任何[整数]值true呢? 字符串比较 由于问题似乎太简单了,所以我将对自己进行一些解释:首先,对于任何程序员来说,这似乎都是显而易见的,但是为什么没有编程语言呢?实际上可能是,但是没有我用了-在哪0求和true,所有其他[整数]值都在false?这句话似乎是随机的,但我举了一些例子,可能是个好主意。首先,让我们以字符串三向比较为例,以C strcmp为例:任何以C为第一语言的程序员都可能会编写以下代码: if (strcmp(str1, str2)) { // Do something... } 由于strcmp返回的0结果是评估false字符串何时相等,因此初阶程序员尝试执行的操作很失败,而且他通常一开始并不理解为什么。曾0评估,以true代替,这个功能可能已在其最简单的表达式中使用-上面的一员-平等的比较时,以及适当的检查-1,并1在需要时将已只是做。bool在大多数情况下,我们会认为返回类型是(在我们看来)。 此外,我们引入一个新的类型,sign即只需要值-1,0和1。那可能很方便。想象一下,在C ++中有一个太空飞船运算符,我们想要它std::string(好吧,已经有compare函数了,但是太空飞船运算符更有趣)。该声明当前将是以下声明: sign operator<=>(const std::string& lhs, const std::string& rhs); 已经0被评估为true,飞船运营商甚至不存在的,我们可以宣称operator==这种方式: sign operator==(const std::string& lhs, const std::string& rhs); 这operator==将立即处理三向比较,并且仍然可以用于执行以下检查,同时在需要时仍能够检查哪个字符串在字典上优于另一个字符串: if (str1 == str2) { // Do something... } 旧错误处理 现在我们有了例外,因此本部分仅适用于不存在此类旧语言的旧语言(例如C)。如果我们看一下C的标准库(还有POSIX),我们可以肯定地看到maaaaany函数0在成功时返回,否则返回任何整数。我可悲地看到有些人做这种事情: #define TRUE 0 // ... if (some_function() == …

16
如果他不期望为空,是否应该检查为空?
上周,我们就在应用程序的服务层中处理null产生了激烈的争论。问题是在.NET上下文中,但在Java和许多其他技术中将是相同的。 问题是:无论什么情况,您是否应该始终检查null并使代码正常工作,还是当意外收到null时让异常冒出? 在我看来,一方面,在您不期望它的地方检查空值(即,没有用户界面来处理它)与编写带有空catch的try块相同。您只是隐藏一个错误。错误可能是代码中的某些内容已更改,并且null现在是预期值,或者存在其他错误,并且将错误的ID传递给该方法。 另一方面,检查空值通常是一个好习惯。此外,如果进行检查,则应用程序可能会继续运行,而只有一小部分功能无效。然后,客户可能会报告一个小错误(例如“无法删除评论”),而不是更严重的错误(例如“无法打开页面X”)。 您遵循哪种做法,您对这两种方法的论点是什么? 更新: 我想添加一些有关我们特殊情况的细节。我们正在从数据库中检索一些对象,并对它们进行了一些处理(比如,建立一个集合)。编写代码的开发人员并不预期该对象可以为null,因此他不包含任何检查,并且在加载页面时出现错误,并且整个页面都没有加载。 显然,在这种情况下,应该进行检查。然后,我们讨论了是否应该检查每个处理的对象(即使不会丢失),以及是否应该静默中止最终的处理。 假设的好处是该页面将继续工作。考虑一下Stack Exchange上不同组(用户,评论,问题)的搜索结果。该方法可以检查是否为空,并中止用户的处理(由于错误为空),但返回“评论”和“问题”部分。该页面将继续工作,只是缺少“用户”部分(这是一个错误)。我们应该尽早失败并中断整个页面,还是继续工作并等待有人注意到“用户”部分丢失了?

12
有人告诉我,异常仅应在例外情况下使用。我怎么知道我的案子是否特殊?
我在这里的特定情况是用户可以将字符串传递到应用程序中,应用程序将对其进行解析并将其分配给结构化对象。有时,用户可能输入了无效的内容。例如,他们的输入可能描述一个人,但他们可能说他们的年龄是“苹果”。在这种情况下,正确的行为是回滚事务并告诉用户发生了错误,他们将不得不再次尝试。可能需要报告我们在输入中发现的每个错误,而不仅仅是第一个。 在这种情况下,我认为我们应该抛出异常。他不同意,说:“例外应该是例外:应该预期用户可能会输入无效数据,所以这不是例外情况”,我真的不知道该如何辩驳,因为按照单词的定义,他似乎是正确的。 但是,据我了解,这就是为什么首先发明例外的原因。过去,您必须检查结果以查看是否发生错误。如果检查失败,可能会在您不注意的情况下发生不良情况。 无一例外,堆栈的每个级别都需要检查调用的方法的结果,如果程序员忘记检入这些级别之一,则代码可能会意外继续并保存无效数据(例如)。这种方式似乎更容易出错。 无论如何,请随时纠正我在这里所说的任何内容。我的主要问题是,如果有人说例外应该是例外,我怎么知道我的情况是否是例外?

12
我的项目需要多大才能进行单元测试?[关闭]
我认为我的项目已解耦到足以进行单元测试的程度。但是,就笔迹和功能而言,我的项目到底需要多大才能使单元测试值得? 我们都会犯错,没有人能做到完美,但是我认为自己是一个体面的程序员,可以逐步解决小项目的错误。还是您的项目规模不限,都必须进行单元测试?

8
返回魔术值,引发异常或在失败时返回false?
有时我最终不得不为类库编写方法或属性,对于该类库,没有真正的答案不是偶然,而是失败。无法确定,无法使用,无法找到,当前无法执行或没有其他可用数据。 我认为对于这种相对非异常的情况,有三种可能的解决方案可以指示C#4失败: 返回一个没有其他含义的魔术值(例如null和-1); 抛出异常(例如KeyNotFoundException); return false并在out参数中提供实际的返回值(例如Dictionary<,>.TryGetValue)。 所以问题是:我应该在哪种非例外情况下抛出异常?而且,如果我不应该抛出:什么时候返回在实现Try*带有out参数的方法时产生的魔术值?(对我来说,该out参数似乎很脏,要正确使用该参数还需要更多工作。) 我正在寻找实际的答案,例如涉及设计准则的答案(我对Try*方法一无所知),可用性(因为我向类库提出的要求),与BCL的一致性以及可读性。 在.NET Framework基类库中,使用了所有三种方法: 返回一个没有其他含义的魔术值: Collection<T>.IndexOf 返回-1, StreamReader.Read 返回-1, Math.Sqrt 返回NaN, Hashtable.Item 返回null; 抛出异常: Dictionary<,>.Item 抛出KeyNotFoundException, Double.Parse抛出FormatException; 要么 return false并在out参数中提供实际的返回值: Dictionary<,>.TryGetValue, Double.TryParse。 请注意,正如HashtableC#中没有泛型时创建的那样,它使用object,因此可以null作为魔术值返回。但是对于泛型,在中使用了例外Dictionary<,>,而最初没有TryGetValue。见解显然在改变。 显然,Item- TryGetValue和Parse- TryParse偶是有原因的,所以我认为抛出异常的非特殊的故障是在C#4 没有这样做。但是,Try*即使存在,方法也不总是存在Dictionary<,>.Item。


16
如何在不支持异常的语言中处理零除?
我正在开发一种新的编程语言来解决一些业务需求,并且该语言面向新手用户。因此,不支持该语言中的异常处理,即使我添加了它,我也不希望他们使用它。 我已经到了必须实现除法运算符的地步,我想知道如何最好地处理除零错误? 我似乎只有三种可能的方式来处理这种情况。 忽略错误并产生0结果。尽可能记录警告。 将其添加NaN为数字的可能值,但这引发了有关如何处理NaN语言其他区域中的值的问题。 终止程序的执行并将严重错误报告给用户。 选项1似乎是唯一合理的解决方案。选项#3不切实际,因为该语言将用作夜间cron来运行逻辑。 解决零除错误的方法是什么,选择#1会有什么风险。

7
是否应该检查C中的每个小错误?
作为一名优秀的程序员,应该编写能处理其程序每个结果的强大代码。但是,当发生错误时,C库中的几乎所有函数都将返回0或-1或NULL。 有时很明显,需要进行错误检查,例如,当您尝试打开文件时。但是我经常忽略诸如printf或什至malloc因为我认为没有必要而进行错误检查。 if(fprintf(stderr, "%s", errMsg) < 0){ perror("An error occurred while displaying the previous error."); exit(1); } 仅忽略某些错误是一种好习惯,还是有一种更好的方法来处理所有错误?
60 c  error-handling 

5
计算机会尝试除以零吗?
我们都知道0/0是Undefined如果我是把它变成一个计算器返回一个错误,如果我是创建一个程序(在C至少)操作系统将终止它,当我试图除以零。 但是我一直想知道的是,计算机是否试图除以零,或者它只是具有“内置保护”,这样当它“看到” 0/0时甚至在尝试计算之前就返回错误?

3
我是否应该使用HTTP状态代码来描述应用程序级别的事件
我处理过的几台服务器将返回HTTP 200,以请求客户端应认为失败的请求,其中的内容为“ success:false”。 在我看来,这似乎不是HTTP代码的正确实现,尤其是在身份验证失败的情况下。我已经很简洁地阅读了HTTP错误代码,其中“ 4xx”指示在更改之前不应该再次发出请求,而“ 5xx”指示该请求可能有效或无效,可以重试,但未成功。在这种情况下,200:登录失败,或200:找不到该文件,或200:缺少参数x,这肯定是错误的。 另一方面,我可以看到有人争论说“ 4xx”应仅表示请求的结构性问题。因此,这很适合返回200:错误的用户名/密码,而不是未经授权的401,因为允许客户端进行请求,但是恰好是错误的。这个论点可以概括为:如果服务器能够处理请求并做出确定,则响应代码应为200,并且由客户端检查主体以获取更多信息。 基本上,这似乎是一个优先事项。但这并不令人满意,因此,我想知道,如果有人有理由说明这些范例中的任何一个更为正确。

6
隐藏的AJAX请求伪造性能有多安全?
什么是隐藏的AJAX请求? 我注意到,旨在使用户操作立即发生的隐藏AJAX请求的使用率有所增加。我将这种类型的AJAX请求称为非阻塞。这是一个AJAX请求,用户没有意识到它正在发生,它是在后台执行的,它的操作是无声的(没有冗长的指示AJAX调用已成功完成)。目的是使操作看起来确实在尚未真正完成时立即发生。 这是非阻塞AJAX请求的示例; 用户单击电子邮件集合上的删除。这些项目会立即从其收件箱中消失,并且可以继续进行其他操作。同时,AJAX请求正在后台处理项目的删除。 用户填写新记录表格。单击保存。新项目将立即显示在列表中。用户可以继续添加新记录。 为了澄清起见,下面是阻止AJAX请求的示例; 用户单击电子邮件集合上的删除。出现沙漏光标。发出AJAX请求,并在响应时关闭沙漏光标。用户必须等待一秒钟才能完成操作。 用户填写新记录表格。单击保存。带有AJAX加载程序动画的表格会变成灰色。显示一条消息“您的数据已保存”,新记录出现在列表中。 上述两种情况之间的区别在于,非阻塞AJAX设置不提供操作执行的反馈,而阻塞AJAX设置提供。 隐藏的AJAX请求的风险 此类AJAX请求的最大风险是,当AJAX请求失败时,Web应用程序可能处于完全不同的状态。 例如,一个非阻塞示例; 用户选择一堆电子邮件。单击删除按钮。该操作似乎立即发生(项目从列表中消失)。然后,用户单击“撰写”按钮,并开始输入新电子邮件。这时JavaScript代码发现AJAX请求失败。该脚本可能会显示错误消息,但目前确实没有意义。 或者,一个阻塞的例子; 用户选择一堆电子邮件。单击删除按钮。看到一个沙漏,但是操作失败。他们收到一条错误消息,说“错误。等等等等”。它们将返回到电子邮件列表,并且仍然具有要删除的电子邮件。他们可以尝试再次删除它们。 执行非阻塞AJAX请求还存在其他技术风险。用户可以关闭浏览器,可以导航到另一个网站,并且他们可以导航到当前网络中的另一个位置,这使得任何错误响应的上下文都变得毫无意义。 那么为什么它变得如此受欢迎? Facebook,Google,Microsoft等。等等。所有这些大型域越来越多地使用非阻塞AJAX请求来使操作看起来像是立即执行的。我还看到没有保存或提交按钮的表单编辑器有所增加。离开字段或按Enter键。该值已保存。没有您的个人资料已更新消息或保存步骤。 AJAX请求不是确定的,在完成之前不应被视为成功,但是许多主要的Web应用程序正像这样运行。 这些使用非阻塞性AJAX调用来模拟响应式应用程序的网站是否冒着快速出现的代价冒着不必要的风险? 为了保持竞争力,我们所有人都应该遵循这种设计模式吗?

7
堆栈跟踪是否应该出现在向用户显示的错误消息中?
我在工作场所有些争论,我试图弄清楚谁是正确的,以及正确的做法是什么。 上下文:我们的客户用于会计和其他ERP内容的Intranet Web应用程序。 我认为向用户显示的错误消息(当事情崩溃时)应该包括尽可能多的信息,包括堆栈跟踪。当然,它必须以友好的大写字母“ N发生错误,请向开发人员提交以下信息”开头。 我的理由是,崩溃的应用程序的屏幕快照通常将是唯一容易获得的信息源。当然,您可以尝试与客户的系统管理员联系,尝试解释您的日志文件在何处,等等,但这可能会很缓慢且令人痛苦(与客户代表进行交流的大部分时间是这样)。 另外,拥有即时和完整的信息在开发中非常有用,在开发中,您不必遍历日志文件即可查找每个异常所需的内容。(但这可以通过配置开关解决。) 不幸的是,已经进行了某种形式的“安全审核”(不知道他们是如何在没有来源的情况下执行此操作的……但是无论如何),并且他们抱怨完整的异常消息将其视为安全威胁。当然,客户(至少是我所知道的)已经从表面上看待了这一点,现在要求清除消息。 我看不到潜在的攻击者如何使用堆栈跟踪来找出他以前无法理解的任何东西。是否有任何例子,有记录的证明有人这样做吗?我认为我们应该与这个愚蠢的想法作斗争,但也许我是这里的傻瓜,所以... 谁是对的?

2
在ASP.NET MVC 3中自定义错误处理的权威性准则是什么?
在ASP.NET MVC(本例中为3)中执行自定义错误处理的过程似乎被忽略了。我已经在网上阅读了各种问题和解答,在各种工具(例如Elmah)的帮助页面上都找到了答案,但是我感觉自己走了一个完整的圈子,但仍然没有最好的解决方案。在您的帮助下,也许我们可以为错误处理设定新的标准方法。我想保持简单,而不是过度设计。 这是我的目标: 对于服务器错误/异常: 在开发人员中显示调试信息 在生产中显示友好的错误页面 记录错误并将其通过电子邮件发送给生产中的管理员 返回500 HTTP状态代码 对于404 Not Found错误: 显示友好的错误页面 记录错误并将其通过电子邮件发送给生产中的管理员 返回404 HTTP状态代码 是否可以通过ASP.NET MVC实现这些目标?


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.