gpt4 book ai didi

java - 将有用的状态信息传递给 Java 中的异常的好方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 22:50:48 31 4
gpt4 key购买 nike

最初我注意到我的问题有些困惑。我不是在问如何配置记录器,也不是在问如何正确使用记录器,而是如何捕获所有本应以比异常消息中当前日志记录级别更低的日志记录级别记录的信息。

我注意到 Java 中有两种模式用于记录信息,当发生异常时它们可能对开发人员有用。

以下模式似乎很常见。基本上,您只需根据需要将记录器日志信息内联,这样当发生异常时您就有日志跟踪。

try {
String myValue = someObject.getValue();
logger.debug("Value: {}", myValue);
doSomething(myValue);
}
catch (BadThingsHappenException bthe) {
// consider this a RuntimeException wrapper class
throw new UnhandledException(bthe);
}

上述方法的缺点是,如果您的用户需要相对安静的日志并且需要高水平的可靠性,以至于他们无法“在 Debug模式下再试一次”,异常消息本身包含的数据不足以对开发人员有用。

下一个模式是我见过的试图缓解这个问题但看起来很丑陋的模式:

String myValue = null;
try {
myValue = someObject.getValue();
doSomething(myValue);
}
catch (BadThingsHappenException bthe) {
String pattern = "An error occurred when setting value. [value={}]";
// note that the format method below doesn't barf on nulls
String detail = MessageFormatter.format(pattern, myValue);
// consider this a RuntimeException wrapper class
throw new UnhandledException(detail, bthe);
}

上面的模式似乎在一定程度上解决了问题,但是,我不确定我是否喜欢在 try block 的范围之外声明这么多变量。特别是当我必须处理非常复杂的状态时。

我见过的唯一其他方法是使用 Map 存储键值对,然后将其转储到异常消息中。我也不确定我是否喜欢这种方法,因为它似乎会造成代码膨胀。

有没有我遗漏的 Java 巫术?您如何处理您的异常状态信息?

最佳答案

我们倾向于使用一些特殊的构造函数、一些常量和一个 ResourceBundle 创建我们最重要的特定于应用程序的运行时异常类。

示例片段:

 public class MyException extends RuntimeException
{
private static final long serialVersionUID = 5224152764776895846L;

private static final ResourceBundle MESSAGES;
static
{
MESSAGES = ResourceBundle.getBundle("....MyExceptionMessages");
}

public static final String NO_CODE = "unknown";
public static final String PROBLEMCODEONE = "problemCodeOne";
public static final String PROBLEMCODETWO = "problemCodeTwo";
// ... some more self-descriptive problem code constants

private String errorCode = NO_CODE;
private Object[] parameters = null;

// Define some constructors

public MyException(String errorCode)
{
super();
this.errorCode = errorCode;
}

public MyException(String errorCode, Object[] parameters)
{
this.errorCode = errorCode;
this.parameters = parameters;
}

public MyException(String errorCode, Throwable cause)
{
super(cause);
this.errorCode = errorCode;
}

public MyException(String errorCode, Object[] parameters, Throwable cause)
{
super(cause);
this.errorCode = errorCode;
this.parameters = parameters;
}

@Override
public String getLocalizedMessage()
{
if (NO_CODE.equals(errorCode))
{
return super.getLocalizedMessage();
}

String msg = MESSAGES.getString(errorCode);
if(parameters == null)
{
return msg;
}
return MessageFormat.format(msg, parameters);
}
}

在属性文件中我们指定异常描述,例如:

 problemCodeOne=Simple exception message
problemCodeTwo=Parameterized exception message for {0} value

使用这种方法

  • 我们可以使用非常易读易懂的 throw 子句(throw new MyException(MyException.PROBLEMCODETWO, new Object[] {parameter}, bthe))
  • 异常消息“集中化”、易于维护且“国际化”

编辑:按照 Elijah 的建议,将 getMessage 更改为 getLocalizedMessage

EDIT2: 忘了提:这种方法不支持“即时”更改语言环境,但它是有意为之的(如果需要,可以实现)。

关于java - 将有用的状态信息传递给 Java 中的异常的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1112771/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com