最佳实践:错误处理

5
我在想如何在像C++、Java、C#这样的编程语言中处理应用程序中的错误。我想创建一个存储与错误和警告消息相关数字的地方,例如:
10000 -> "无法读取文件"。 ... 20000 -> "缓冲区溢出"。 ... 80000 -> "关键问题"。
我认为将错误与数字进行映射是一个好习惯。不论以后在哪种语言中显示,都更容易找到相应错误。你们对此有何看法?是否有更好的方法?
另一个问题是如何存储和创建它们?使用大的通用枚举是一个好的解决方案吗?我们需要将它们存储在数据库或文件中吗?
应该具备以下特点:
1. 易于在代码中查找错误(即通过编号)。 2. 易于添加新错误(如果错误编号不重复可能有些棘手)。
你们对此有何看法?
提前感谢您的帮助和建议!

目前Windows操作系统使用0到16,000,Linux使用0到+131。https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes?redirectedfrom=MSDN - Yousha Aleayoub
2个回答

8
使用错误码来识别异常不是一种坏习惯。这可以在生产环境中非常有用,使日志文件更短并可用于国际化错误消息。但是,在开发过程中,收到错误代码而不是具有有意义描述的完整错误消息可能会让人感到烦恼。开发人员必须去查看错误代码是关于什么的。在我的一个Java项目中,我采用了混合方法。我的根异常有一个使用枚举类的构造函数。该枚举类包含错误代码+默认错误消息列表。
public enum ErrorCodes {

    VALIDATION_ERROR(5001, "One of the objects cannot be validated"),
    RESOURCE_NOT_FOUND(4004, "The requested resource does not exist"),

根异常还有其他构造函数,因此开发人员可以覆盖默认消息:

public CoreException(ErrorCodes _errorCode, final String message, final Throwable cause) {
   super(message, cause);
   errorCode = _errorCode.getCode();
}


public CoreException(ErrorCodes _errorCode, final String message) {
   super(message);
   errorCode = _errorCode.getCode();
}

当捕获异常时,异常处理程序可以根据某些配置设置决定记录错误和消息或仅记录错误。更复杂的错误处理程序还可以根据错误代码从资源包中查找特定语言的消息。


是的,这正是我要找的。我不想只显示一个数字,那样找相关错误会很痛苦。但我想为用户显示数字和易懂的文本。这样,如果在某个时刻我们得到了一个外语截图,仍然可以通过数字匹配错误!实际上,我们正在考虑使用数字和默认文本,就像你一样。它以另一种方式实现,但思路保持不变!谢谢你的回答! - Andy M
对于多模块应用/系统,我建议通过层次结构(模块/进程定义MS位,子模块定义下一位,类(或其他小代码块)定义LS位)来管理错误编号分配。 - Israel Shainert

0

不要这么做。

我们有比C和FORTRAN更好的工具。

抛出异常并给出名称。C#和Java会提供调用堆栈。

C++可以告诉你异常的类型(几乎只能如此)。


2
生产监控怎么样?在部署具有多个组件的大型应用程序时,错误代码非常重要。正常的生产环境会监视日志以查找特定字符串(大多数情况下是错误代码),并对其进行处理。此外,您真的想最终拥有数百个异常类吗? - Luciano Fiandesio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接