全量异常扑捉注解:@SneakyThrows

@SneakyThrows

大胆抛出已检查的异常,以前没有人抛出它们!

Overview

@SneakyThrows可以用来偷偷抛出已检查的异常而不在方法的throws子句中实际声明这一点。当然,应该谨慎使用这种有争议的能力。由lombok生成的代码不会忽略,包装,替换或以其他方式修改抛出的已检查异常; 它只是伪造了编译器。在JVM(类文件)级别,无论方法的throws子句如何,都可以抛出所有异常,无论是否检查,这就是为什么这样做的原因。

当您想要选择退出已检查的异常机制时,常见的用例围绕两种情况:
一个不必要的严格的接口,例如Runnable- 无论是否传播出你的run()方法,检查与否,它都将被传递给Thread未处理的异常处理程序。捕获已检查的异常并将其包装在某种情况RuntimeException下只会模糊问题的真正原因。
一个'不可能'的例外。例如,new String(someByteArray, "UTF-8");声明它可以抛出UnsupportedEncodingException但是根据JVM规范,UTF-8 必须始终可用。一个UnsupportedEncodingException在这里大约是有可能的ClassNotFoundError,当你使用一个String对象,而你没有赶上那些要么!
请注意,直接捕获偷偷摸摸的已检查类型是不可能的,因为javac不允许您为try体中没有方法调用声明为抛出的异常类型编写catch块。此问题与上面列出的任何一个用例都无关,所以请注意这个问题,不要在@SneakyThrows没有经过深思熟虑的情况下使用该机制!

您可以将任意数量的例外传递给@SneakyThrows注释。如果你没有通过任何例外,你可以偷偷地抛出任何例外。

With Lombok

import lombok.SneakyThrows;

public class SneakyThrowsExample implements Runnable {
  @SneakyThrows(UnsupportedEncodingException.class)
  public String utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
  }
  
  @SneakyThrows
  public void run() {
    throw new Throwable();
  }
}

Vanilla Java

import lombok.Lombok;

public class SneakyThrowsExample implements Runnable {
  public String utf8ToString(byte[] bytes) {
    try {
      return new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw Lombok.sneakyThrow(e);
    }
  }
  
  public void run() {
    try {
      throw new Throwable();
    } catch (Throwable t) {
      throw Lombok.sneakyThrow(t);
    }
  }
}

Supported configuration keys:

lombok.sneakyThrows.flagUsage = [warning | error] (default: not set)

Small print

因为@SneakyThrows是一个实现细节而不是方法签名的一部分,所以当你不调用任何抛出此异常的方法时,如果你试图将一个被检查的异常声明为偷偷抛出则是一个错误。(throws对于容纳子类的语句,这样做是完全合法的)。同样,@SneakyThrows不继承。

对于人群中的不同说法者:开箱即用,Eclipse将为未捕获的异常提供“快速修复”,这些异常包含在catch块中的try / catch块中的违规语句e.printStackTrace()。与仅仅偷偷地抛出异常相比,这是非常无效的,Roel和Reinier认为被检查的异常系统远非完美,因此有理由选择退出机制。

如果你加上@SneakyThrows一个构造函数,那么对兄弟或超级构造函数的任何调用都将被排除在@SneakyThrows处理之外。这是我们无法解决的java限制:对兄弟/超级构造函数的调用必须是构造函数中的第一个语句; 它们不能放在try / catch块中。

@SneakyThrows 在一个空方法,或一个空的构造函数或只有一个兄弟/超级构造函数的调用导致没有try / catch块和警告。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
@SneakyThrows是一个注解,它是由Lombok库提供的。它的作用是在编译时自动将注解标记的方法中的异常处理代码替换为try-catch块。使用@SneakyThrows注解时,可以在方法声明中抛出任意数量的异常。如果没有指定任何异常类型,就可以偷偷地抛出任何异常。该注解不会继承给子类,因为它只是一种实现细节而不是方法签名的一部分。通过使用@SneakyThrows注解,可以消除在代码中手动编写try-catch块的繁琐,提高代码的可读性和简洁性。例如,使用@SneakyThrows注解可以将以下代码:```public void utf8ToString(byte[] bytes) { try { return new String(bytes, "UTF-8"); } catch (UnsupportedEncodingException e) { throw Lombok.sneakyThrow(e); } }```简化为:```@SneakyThrows public void utf8ToString(byte[] bytes) { return new String(bytes, "UTF-8"); }```<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [全量异常注解@SneakyThrows](https://blog.csdn.net/majunzhu/article/details/101033226)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [spring注解@SneakyThrows](https://blog.csdn.net/m0_47743175/article/details/127989108)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值