所以我有一个函数,看起来是这样的:
public void addExceptionCommands(Class<? extends Throwable> exClass, Command... commands) {
for (Command command : commands) {
try {
//Push the command to the stack of executed commands
executedCommands.push(command);
command.execute();
} catch (CouldNotExecuteCommandException e) {
// Default strategy is to rollback
rollback();
// Log
e.printStackTrace();
//I want to throw exClass here
}
}
}我想扔exClass,怎么做到这一点?抛出exClass不工作
编辑:谢谢大家的回答,最后我用了一个供应商:D
发布于 2019-11-20 16:44:13
您只能抛出Throwable和Class的子类。
但是,您可以修改方法以接受一个供应商,该供应商生成一个新的Throwable,然后您可以抛出:
public <T extends Throwable> void addExceptionCommands(Supplier<T> exceptionSupplier, Command... commands) throws T {
for (Command command : commands) {
try {
//Push the command to the stack of executed commands
executedCommands.push(command);
command.execute();
} catch (CouldNotExecuteCommandException e) {
// Default strategy is to rollback
rollback();
// Log
e.printStackTrace();
//I want to throw exClass here
final T exception = exceptionSupplier.get();
exception.addSuppressed(e);
throw exception;
}
}
}然后,您可以像这样调用您的方法:
addExceptionCommands(YourException::new, command1, command2, ...);发布于 2019-11-20 16:42:11
当您有一个类类型时,您可以执行以下操作
throw exClass.newInstance(); 发布于 2019-11-20 16:47:43
该参数是一种异常类型。如果抛出某物,它必须是异常的实例。
我不认为这会像你想的那样奏效。
如果希望调用方定义抛出的异常类型,则让调用方在自己的code.中这样做--调用方可以捕获方法抛出的异常,并将其包装在它选择的任何异常中。
public void addExceptionCommands( Command... commands)
throws CouldNotExecuteCommandException {
...
}
...
try {
commandable.addExceptionCommands( myCommands );
} catch (CouldNotExecuteCommandException e) {
// Wrap the command exception in my own.
throw new MySpecialException( "My message", e );
}如果您想支持命令中的各种异常,考虑由Java的java.util.concurrent包提供的示例。考虑ExecutorService.submit()方法和Future.get()方法。提交给执行器的任务可能引发范围广泛的异常。但是,Future.get()将抛出的异常封装在一个定义良好的单个异常中,并声明为ExecutableException。
https://stackoverflow.com/questions/58959238
复制相似问题