我正在开发一些后台程序,并且不时地执行“某些”操作。 但是,“某些”可能出现问题,我想编写日志以便找出问题所在,错误可能有不同的原因。 我正在使用一个闭源库(目前没有可用文档),我不知道抛出的异常的结构,堆栈跟踪不能提供足够的信息。
问题:如何使我不想知道的异常类显示“所有可能的信息”?
也就是说,有没有办法让异常自行解释,而无需任何其他知识?
例如(小心,冗长 :-)):
让我们考虑以下银行账户的示例。 账户有一个函数提供“取款”功能,显然(或者我应该说可悲的是)会引发异常“资金不足异常”。
现在,在主调用代码中,我可能会做类似以下的事情:
因此,一方面,代码变得非常笨拙(我需要在函数调用堆栈中拖动许多不同的异常),另一方面,我不知道AddMoneyException和NetworkUnreachableException的原因(除了它们的名称,我不知道为什么网络无法访问或者为什么我们不能向账户中添加一些钱)。
所以我认为,在抛出异常的地方分发异常并创建一个新的异常'RequestFailedException'是个好主意,然后可以像这样统一处理:
现在,提款功能看起来像这样:
问题:如何使我不想知道的异常类显示“所有可能的信息”?
也就是说,有没有办法让异常自行解释,而无需任何其他知识?
例如(小心,冗长 :-)):
让我们考虑以下银行账户的示例。 账户有一个函数提供“取款”功能,显然(或者我应该说可悲的是)会引发异常“资金不足异常”。
public class Account {
[...]
private double balance;
public void withdraw(double amountWithDraw) throws InsufficientFundsException {
if(amountWithDraw <= balance) {
balance -= amountWithDraw;
} else {
throw new InsufficientFundsException(balance, amountWithDraw);
}
}
}
异常类的外观如下
public class InsufficientFundsException extends Exception {
private double balance;
private double amountWithDraw;
public InsufficientFundsException(double balance, double amountWithDraw) {
this.amountWithDraw = amountWithDraw;
}
public double getBalance() {
return amountWithDraw;
}
public double getAmountWithDraw() {
return amountWithDraw;
}
}
现在,在主调用代码中,我可能会做类似以下的事情:
try {
account.withdraw(amountWithDraw);
} catch (InsufficientFundsException e) {
System.out.println("Tried to reduce " + e.getBalance() + " by " + e.getgetAmountWithDraw() + " but taking this much amount of money from the account is not possible!");
}
在这之前,一切都还不错,但是假设主要代码收到了许多不同的“请求”(添加资金、减去资金、发送包含账户金额的信息等),每个请求都可能出现不同的失败情况,如AddMoneyException、NetworkUnreachableException,因此主代码将如下所示:
try {
handleRequest(...);
} catch (InsufficientFundsException e) {
System.out.println("Tried to reduce " + e.getBalance() + " by " + e.getgetAmountWithDraw() + " but taking this much amount of money from the account is not possible!");
} catch (NetworkUnreachableException e) {
System.out.println("Network unreachable.");
} catch (AddMoneyException e) {
...
} and so on and so on
因此,一方面,代码变得非常笨拙(我需要在函数调用堆栈中拖动许多不同的异常),另一方面,我不知道AddMoneyException和NetworkUnreachableException的原因(除了它们的名称,我不知道为什么网络无法访问或者为什么我们不能向账户中添加一些钱)。
所以我认为,在抛出异常的地方分发异常并创建一个新的异常'RequestFailedException'是个好主意,然后可以像这样统一处理:
try {
handleRequest(...);
} catch (RequestFailedException e)
System.out.println("Request failed. Reason=" + e.getReason());
}
现在,提款功能看起来像这样:
public void withdrawUnified(double amountWithDraw) throws RequestFailedException{
try {
widthDraw(amountWithDraw);
} catch (InsufficientFundsException e) {
throw new RequestFailedException("Tried to reduce " + e.getBalance() + " by " + e.getgetAmountWithDraw() + " but taking this much amount of money from the account is not possible!");
} catch (NetworkUnreachableException e) {
throw new RequestFailedException("Network is unreachable!");
}
}
因此,我需要将可能发生的所有异常转换为包含异常信息的字符串(例如“自定义属性”如余额和提款金额,而不仅仅是 StackTrace)。但我不知道 / 无法猜测这些属性。是否有一种统一的函数类似于 toString 可以实现?只需执行:
public void withdrawUnified(double amountWithDraw) throws RequestFailedException{
try {
widthDraw(amountWithDraw);
} catch (Exception e) {
throw new RequestFailedException("Exception=" e);
}
}
这种方法无法正常工作,因为它只会打印出堆栈跟踪的第一行。
谢谢并致以问候。
FW
Throwable.getMessage()
方法? - Arnaud