投掷 Class<?扩展可抛>
throwing Class<? extends Throwable>
所以我有一个看起来像这样的函数:
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 不起作用
编辑:
感谢大家的所有回答,我最终使用了 Supplier :D
当你有 class 类型时,你可以做类似
的事情
throw exClass.newInstance();
您只能抛出 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, ...);
参数是类型的异常。如果你抛出一些东西,它必须是异常的实例。
我认为这不会像您想象的那样起作用。
如果你想让调用者定义抛出异常的类型,然后让调用者在自己的代码中定义. A调用者可以捕获您的方法抛出的异常,并将其包装在它选择的任何异常中。
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
.
中
尝试使用 java.lang.reflect.Constructor
Constructor.newInstance()
优于 Class.newInstance()
,因为它允许您使用参数来创建新实例。
Constructor constructor = exClass.getDeclaredConstructor();
Throwable ex = (Throwable) constructor.newInstance();
throw ex;
使用 String
参数(用于消息?)
Constructor constructor = exClass.getDeclaredConstructor(String.class);
Throwable ex = (Throwable) constructor.newInstance("message goes here");
throw ex;
https://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
此外,Class.newInstance()
已被弃用。
https://docs.oracle.com/javase/9/docs/api/java/lang/Class.html#newInstance--
所以我有一个看起来像这样的函数:
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 不起作用
编辑: 感谢大家的所有回答,我最终使用了 Supplier :D
当你有 class 类型时,你可以做类似
的事情throw exClass.newInstance();
您只能抛出 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, ...);
参数是类型的异常。如果你抛出一些东西,它必须是异常的实例。
我认为这不会像您想象的那样起作用。
如果你想让调用者定义抛出异常的类型,然后让调用者在自己的代码中定义. A调用者可以捕获您的方法抛出的异常,并将其包装在它选择的任何异常中。
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
.
尝试使用 java.lang.reflect.Constructor
Constructor.newInstance()
优于 Class.newInstance()
,因为它允许您使用参数来创建新实例。
Constructor constructor = exClass.getDeclaredConstructor();
Throwable ex = (Throwable) constructor.newInstance();
throw ex;
使用 String
参数(用于消息?)
Constructor constructor = exClass.getDeclaredConstructor(String.class);
Throwable ex = (Throwable) constructor.newInstance("message goes here");
throw ex;
https://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
此外,Class.newInstance()
已被弃用。
https://docs.oracle.com/javase/9/docs/api/java/lang/Class.html#newInstance--