Language agnostic 代码应该在多大程度上解释致命异常?

Language agnostic 代码应该在多大程度上解释致命异常?,language-agnostic,error-reporting,Language Agnostic,Error Reporting,我怀疑所有非平凡的软件都可能遇到这样的情况:它遇到了无法解决的外部问题,因此需要失败。这可能是由于配置不正确、外部服务器关闭、磁盘已满等原因造成的 在这些情况下,尤其是当软件在非交互模式下运行时,我希望人们真正能做的就是记录错误,等待管理员读取日志并修复问题。如果同时有人与软件进行交互,例如,服务器收到的请求未能正确初始化,则可能会给出适当的提示以检查日志,甚至可能会回显错误(取决于您是否能判断他们是技术人员而不是业务用户)。不过现在我们不要对这一部分想得太多 我的问题是,软件应该在多大程度上负

我怀疑所有非平凡的软件都可能遇到这样的情况:它遇到了无法解决的外部问题,因此需要失败。这可能是由于配置不正确、外部服务器关闭、磁盘已满等原因造成的

在这些情况下,尤其是当软件在非交互模式下运行时,我希望人们真正能做的就是记录错误,等待管理员读取日志并修复问题。如果同时有人与软件进行交互,例如,服务器收到的请求未能正确初始化,则可能会给出适当的提示以检查日志,甚至可能会回显错误(取决于您是否能判断他们是技术人员而不是业务用户)。不过现在我们不要对这一部分想得太多

我的问题是,软件应该在多大程度上负责解释致命错误的含义?一般来说,允许您假定软件管理员具备多少能力/知识,在记录致命错误时,您应该包括多少故障排除信息和潜在的解决步骤?当然,如果有运行时上下文所特有的内容,那么一定要记录下来;但让我们假设您的软件需要通过LDAP与Active Directory通信,并返回一个错误“
[LDAP:错误代码49-80090308:ldaper:DSID-0C0900334,注释:AcceptSecurityContext error,data 525,vece]
”。假设维护人员能够通过谷歌搜索错误代码并找出其含义,或者软件应该尝试解析错误代码并记录这是由LDAP配置中不正确的用户DN引起的,这是否合理


我不知道是否有一个明确的最佳实践答案,因此我渴望听到各种观点。

对于所有广泛的问题,答案是“视情况而定”

如果您正在查看一个配置错误,那么您应该尽一切努力解释错误(在日志中)。如果这是一个内存不足的错误,那么您就无能为力了,甚至可能无法编写日志消息

你说的一件事与我有关:

如果有人碰巧与 同时,该软件,例如 请求进入一个 未能正确初始化,然后重试 也许可以给出一个适当的提示 让我检查日志


如果这确实是一个致命错误,则服务器不应运行,因此任何传入的请求都应在没有任何警告或解释的情况下失败。

我想这取决于您在向客户交付软件之前有多少时间

是的,解析错误并给出更明确的信息是很好的,但在今天这个时代,谷歌并不总是很遥远


因此,除非您有时间创建代码来解析错误,否则我会让它们保持原样。

您至少应该提供来自异常的消息和堆栈跟踪,以便您可以找出它发生在代码中的位置。如果可能,您还应该解释您试图执行的操作以及您认为可能发生的情况,具体取决于异常类型。

我倾向于同意的方法是,如果致命错误是由您自己负责的某些代码(即非第三方)引起的,您应该尽可能多地解释。否则,如果错误是由“进一步向下”引起的,例如在数据库级别,则应向管理员传递返回的错误,而无需添加更多信息。因此,如果数据库服务器死亡,那么您的连接器将抛出一些异常,并且您将在异常中记录错误代码

然后,管理员或支持人员应具备足够的知识,以使用提供的信息解决问题

如果您提供了太多不是由您自己的代码引起的错误的详细信息,则可能会导致错误详细信息与实际错误的原因不匹配,尤其是在错误代码停止在版本之间匹配的情况下

当然,也有例外。我们使用的开放源代码库文档记录得非常糟糕,以至于我们最终在库周围编写了包装器,只是为了对实际发生的情况提供良好的日志记录


在这种情况下,你不能提供太多的信息

然而,在现实世界中,这归结为成本效益分析。错误对你、你的应用程序、你的业务等有什么影响?花多少时间值得


在业务关键型应用程序中,我的第一点适用。其他一切都是一个滑动比例。

我认为这取决于谁在使用该应用程序

如果精通技术的人使用该应用程序,则会显示更多的技术细节,以便他们能够在需要时解决问题。我让一些用户竭尽全力解决问题。它可能非常有用,特别是对于特定于某些配置的问题

如果你的用户群更多的是普通用户,那么在大多数情况下,技术细节会让他们感到困惑。您应该向他们显示一条简单的错误消息,并尽可能提供一些解决方案

您还可以合并这两种技术。默认情况下显示一条简单的错误消息,并允许用户根据需要查看更详细的错误信息


你只是不想用太多他们不理解的信息压倒用户。在大多数情况下,这会使他们感到沮丧和困惑。

我认为所有错误和例外都应该有两个方面:

1) 错误中有足够的信息来帮助调试问题。Stacktrace、类/方法名称、异常类型等属于此类

2) 一条人类可以理解的消息,理想情况下足够清晰,以便Ops团队或系统管理员工程师知道调用或转发该错误消息的人