Questions tagged «error-handling»

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

11
REST API是否应该返回500 Internal Server Error以指示查询引用了不存在的对象?
我正在使用REST API,该API驻留在为大量IoT设备处理数据的服务器上。 我的任务是使用API​​查询服务器以收集有关所述设备的特定性能信息。 在一个实例中,我获得了可用设备及其对应标识符的列表,然后稍后使用那些标识符(GUID)向服务器查询更多详细信息。 服务器正在500 Internal Server Error对这些ID之一返回a 进行查询。在我的应用程序中,引发了异常,并且我看不到有关该错误的详细信息。如果我使用Postman更仔细地检查响应,则可以看到服务器在包含以下内容的正文中返回了JSON: errorMessage: "This ID does not exist"。 忽略服务器提供ID开头的事实-这对于开发人员是一个单独的问题。 REST API是否应返回,500 Internal Server Error以报告查询引用了不存在的对象?在我看来,HTTP响应代码应严格参考REST调用的状态,而不是API的内部机制。我希望200 OK响应中包含错误和描述,这是所讨论的API专有的。 在我看来,取决于REST调用的结构,期望值可能存在差异。 考虑以下示例: http://example.com/restapi/deviceinfo?id=123 http://example.com/restapi/device/123/info 在第一种情况下,设备ID作为GET变量传递。404或500表示/restapi/deviceinfo找不到路径()或导致服务器错误。 在第二种情况下,设备ID是URL的一部分。我会更了解404 Not Found,但仍可以根据路径的哪些部分被解释为变量还是端点来争论。

6
应该向用户显示多少有关错误的信息?
应用程序总是会抛出错误。如果发生此类错误,则应通知用户,因为他要求应用程序执行的操作未成功。 但是,应该向用户提供多少信息?我认为我们大多数人都同意不显示堆栈跟踪(堆栈跟踪是否应该出现在向用户显示的错误消息中?),但是我找不到有关其余错误内容或向错误显示的内容的问题。用户。 例如,支持异常的语言(.net,java)具有共享的异常类型(发生异常的位置)以及与异常一起传递的澄清消息。还应该对用户隐藏吗?还是我们应该显示这个?还是应该显示一般性消息?还是应该根据潜在的异常是显示大量消息之一?

15
支持或反对使用Try / Catch作为逻辑运算符的论点
我刚刚在我们公司的应用程序中发现了一些可爱的代码,这些代码使用Try-Catch块作为逻辑运算符。 意思是,“执行一些代码,如果抛出此错误,则执行此代码,但如果抛出此错误,则执行此第三项操作”。 它使用“最后”作为出现的“其他”语句。 我知道这本质上是错的,但是在我去打架之前,我希望能有一些深思熟虑的论点。 嘿,如果您有关于以这种方式使用Try-Catch的参数,请务必告知。 对于任何想知道的人,该语言是C#,所讨论的代码大约有30多行,并且正在寻找特定的异常,因此它无法处理所有异常。

7
反对错误抑制的论点
我在我们的一个项目中发现了一段这样的代码: SomeClass QueryServer(string args) { try { return SomeClass.Parse(_server.Query(args)); } catch (Exception) { return null; } } 据我了解,抑制这样的错误是一个坏习惯,因为它会破坏原始服务器异常中的有用信息,并使代码在实际终止时继续执行。 何时才应该像这样完全消除所有错误?

9
可能写太多的断言吗?
我非常喜欢assert用C ++代码编写检查,以此来捕获开发过程中由于程序中的逻辑错误而无法发生但确实会发生的情况。通常,这是一个好习惯。 但是,我注意到,我编写的某些函数(属于复杂类的一部分)具有5个以上的断言,就可读性和可维护性而言,这似乎可能是一种不良的编程习惯。我认为它仍然很棒,因为每个人都需要我考虑函数的前置条件和后置条件,它们确实有助于捕获错误。但是,我只是想把它放在那儿,以问在需要进行大量检查的情况下,是否存在更好的范例来捕获逻辑错误。 Emacs注释:由于Emacs是我的首选IDE,因此我将它的assert语句略显灰色,这有助于减少它们可以提供的混乱感。这是我添加到.emacs文件中的内容: ; gray out the "assert(...)" wrapper (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(assert\(.*\);\\)" 1 '(:foreground "#444444") t))))) ; gray out the stuff inside parenthesis with a slightly lighter color (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<assert\\(\(.*\);\\)" 1 '(:foreground "#666666") t)))))

3
地址0000000C是一个特殊地址吗?
编程时有时会中断。您犯了一个错误,程序尝试从错误的地址读取。 在我眼前一亮的是,这些例外通常是: Access violation at address 012D37BC in module 'myprog.exe'. Read of address 0000000C. 现在,我看到了很多错误日志,而对我而言突出的是:0000000C。这是“特殊”地址吗?我看到了其他读取错误的访问冲突,但地址似乎是随机的,但是这种情况在完全不同的情况下会不断出现。

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 …


6
空指针与空对象模式
归因:这源于一个相关的P.SE问题 我的背景是C / C ++,但是我在Java中工作了很多,目前正在编写C#。由于我的C语言背景,检查传递的指针和返回的指针是二手的,但是我承认这偏颇了我的观点。 最近,我提到了空对象模式,其中的想法是始终返回对象。正常情况下返回预期的填充对象,错误情况下返回空对象而不是空指针。前提是调用函数将始终具有某种要访问的对象,因此避免了空访问内存冲突。 那么,与使用Null Object Pattern相比,Null Check的利弊是什么? 我可以看到带有NOP的更干净的调用代码,但是我还可以看到它将在何处创建隐藏的失败,否则这些失败将不会引发。我宁愿让我的应用程序在开发过程中严重失败(又称异常),而不愿让无声的错误逃脱。 空对象模式不能像不执行空检查一样具有类似的问题吗? 我使用过的许多对象都拥有自己的对象或容器。似乎我必须有一个特殊情况,才能保证所有主要对象的容器都有自己的空对象。多层嵌套似乎会使这种情况变得难看。

4
功能样式异常处理
有人告诉我,在函数式编程中,不应抛出和/或观察异常。取而代之的是,应将错误的计算结果视为底值。在Python(或其他不完全鼓励函数式编程的语言)中,只要出现“保持纯净”的错误,就可以返回None(或另一种替代方法,尽管None它严格地不符合定义)。所以必须首先观察到错误,即 def fn(*args): try: ... do something except SomeException: return None 这违反纯洁吗?如果是这样,是否意味着不可能仅用Python处理错误? 更新资料 埃里克·利珀特(Eric Lippert)在他的评论中使我想起了FP中处理异常的另一种方法。尽管我从未在实践中看到过用Python完成的工作,但一年前我学习FP时我还是玩过它。在这里,任何optional装饰函数返回的Optional值对于正常输出以及指定的异常列表都可以为空(未指定的异常仍可以终止执行)。Carry创建一个延迟的评估,其中每个步骤(延迟的函数调用)要么Optional从上一步获取非空输出,然后继续传递,要么通过一个new评估自身Optional。最后,最终值是normal或Empty。此处,该try/except块隐藏在装饰器后面,因此可以将指定的异常视为返回类型签名的一部分。 class Empty: def __repr__(self): return "Empty" class Optional: def __init__(self, value=Empty): self._value = value @property def value(self): return Empty if self.isempty else self._value @property def isempty(self): return isinstance(self._value, BaseException) or self._value is Empty def __bool__(self): …

3
在C#中,为什么在try块内声明的变量的作用域受到限制?
我想将错误处理添加到: var firstVariable = 1; var secondVariable = firstVariable; 以下内容无法编译: try { var firstVariable = 1; } catch {} try { var secondVariable = firstVariable; } catch {} 为什么try catch块必须像其他代码块一样影响变量的范围?除了保持一致性之外,对于我们而言,无需重构就能够使用错误处理包装代码是否有意义?

2
报告Haskell错误的最干净方法
我正在学习Haskell,并且遇到了三种不同的方法来处理我编写的函数中的错误: 我可以简单地编写error "Some error message.",从而引发异常。 我可以让我的函数return Maybe SomeType,在这里我可能无法返回我想返回的内容。 我可以使用函数return Either String SomeType,在这里我可以返回错误信息或首先要返回的内容。 我的问题是:我应该使用哪种处理错误的方法,为什么?根据上下文,也许我应该使用不同的方法? 我目前的理解是: 在纯功能代码中处理异常是“困难的”,在Haskell中,人们希望将事物保持尽可能纯的功能。 Maybe SomeType如果函数失败或成功(即,失败的方式没有不同),则返回是正确的做法。 Either String SomeType如果函数可能以各种方式中的任何一种失败,则返回是正确的做法。

3
如何处理命令中的验证后错误(DDD + CQRS)
例如,当您提交注册表单时,您必须在Domain Model(WriteModel中CQRS)中检查表单是否处于有效状态(例如,电子邮件地址语法,年龄等)。 然后,您创建一个Command,并将其发送到Command Bus。 我知道Commands不应该返回任何东西。 那么,您如何处理超出范围的错误Command Bus呢?(例如,用户在1秒钟之前使用进行了注册username/email)。 您如何知道该命令失败,以及如何知道该错误?

2
多层体系结构:应该在哪里实施错误记录\处理?
我目前正在重构具有多层体系结构的大型子系统,并且正在努力设计一种有效的错误记录\处理策略。 假设我的架构包含以下三层: 公共接口(即MVC控制器) 域层 资料存取层 我的困惑源是我应该在哪里实施错误日志记录\处理: 最简单的解决方案是在顶层(即Public Interface \ MVC Controller)实现日志记录。但是,这感觉不对,因为这意味着将异常遍历不同的层,然后将其记录下来。而不是将异常记录在源头。 从源头记录异常显然是最好的解决方案,因为我掌握了最多的信息。我的问题是,如果不捕获所有异常,就无法在源头捕获每个异常,并且在域/公共接口层中,这将导致捕获已被下面的层捕获,记录和重新抛出的异常。 另一种可能的策略是#1和#2的混合使用。因此,我在最有可能引发异常的层上捕获了特定异常(例如,SqlExceptions在数据访问层中捕获,记录和重新抛出异常),然后在顶层记录了任何其他未捕获的异常。但是,这还需要我在顶层捕获并重新记录每个异常,因为我无法区分已记录\处理过的错误与未记录过的错误。 现在,显然这是大多数软件应用程序中的问题,因此必须有一个解决该问题的标准解决方案,以使异常在源头被捕获并记录一次。但是我自己却看不到该怎么做。 请注意,该问题的标题与“ 在多层应用程序中记录异常 ”非常相似,但是该帖子中的答案不够详细,不足以回答我的问题。

3
我的值检查器函数需要同时返回布尔值和消息
我有一个值检查功能,类似于信用卡号检查功能,它以字符串形式传递,并且需要检查该值的格式正确。 如果格式正确,则需要返回true。 如果格式不正确,则需要返回false,并告诉我们该值出了什么问题。 问题是,实现此目标的最佳方法是什么? 以下是一些解决方案: 1.使用整数/枚举返回码表示含义: String[] returnCodeLookup = [ "Value contains wrong number of characters, should contain 10 characters", "Value should end with 1", "Value should be a multiple of 3" ] private int valueChecker(String value) { /*check value*/ return returnCode; } rc = checkValue(valueToBeChecked); if rc == 0 …

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.