首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扔Class<?扩展Throwable>

扔Class<?扩展Throwable>
EN

Stack Overflow用户
提问于 2019-11-20 16:35:38
回答 4查看 652关注 0票数 1

所以我有一个函数,看起来是这样的:

代码语言:javascript
复制
    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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-20 16:44:13

您只能抛出ThrowableClass的子类。

但是,您可以修改方法以接受一个供应商,该供应商生成一个新的Throwable,然后您可以抛出:

代码语言:javascript
复制
    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;
            }
        }
    }

然后,您可以像这样调用您的方法:

代码语言:javascript
复制
addExceptionCommands(YourException::new, command1, command2, ...);
票数 1
EN

Stack Overflow用户

发布于 2019-11-20 16:42:11

当您有一个类类型时,您可以执行以下操作

代码语言:javascript
复制
throw exClass.newInstance(); 
票数 1
EN

Stack Overflow用户

发布于 2019-11-20 16:47:43

该参数是一种异常类型。如果抛出某物,它必须是异常的实例。

我不认为这会像你想的那样奏效。

如果希望调用方定义抛出的异常类型,则让调用方在自己的code.中这样做--调用方可以捕获方法抛出的异常,并将其包装在它选择的任何异常中。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58959238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档