Java异常处理分为错误、已检查异常和未检查异常。这个问题是关于例外的。
正常的Java异常处理是扩展检查异常的异常类,并通过考虑异常层次结构来处理您需要的异常。
例如:
public class ExceptionA extends Exception {}
public class RunClass {
public static void main() {
try {
RunClass runClass = new RunClass();
runClass.doSomething();
} catch(ExceptionA eA) {
// Do ExceptionA related resolutions.
} catch(Exception e) {
// Do Exception related resolutions.
}
}
public doSomething() throws ExceptionA {
throw new ExceptionA();
}
}
但是我看到了主要的Spring书籍,甚至在Spring boot中提到的Internet教程中,以及在微服务的上下文中,总是从RuntimeException类扩展而来,即使使用@ControllerAdvice。
这显然违反了Java异常处理的基本原则。但是仍然有一个论点说,它是用RuntimeException扩展的,因为这个异常是由@ExceptionHandler方法处理的,并且它是在运行时生成和处理的。
尽管如此,由于RuntimeExcure的这个扩展使得编译时异常处理跟踪不可见,并且很难追溯异常是如何抛出的。由于这些原因,我仍然相信,遵循基本的Java检查和未检查的异常处理概念仍然与@ExceptionHandler方法。
例如:
public class ExceptionRA extends RuntimeException {}
@ContollerAdvice
public class ExceptionHandler {
@ExceptionHandler(ExceptionRA.class)
public String handleException (Exception exception, Model model) {
return "exception";
}
}
@Controller
public class RunClass {
@RequestMapping("/url1")
public doSomething() {
throw new ExceptionRA();
}
}
我应该使用@ExcpetionHadler遵循所有异常场景的扩展RuntimeException,还是使用@ExceptionHaldler遵循基本的Java检查和取消检查机制?欢迎提出意见、建议和更正。
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<List<ErrorDto>> handleNotFoundException(NotFoundException e){
final String message = "The provided id is not in DB" + e.getMessage() + " " + "not found";
final List<ErrorDto> errorDto = new ArrayList<>();
errorDto.add(new ErrorDto("400", message, e.getField()));
return new ResponseEntity<>(errorDto, HttpStatus.BAD_REQUEST);
}
====================================================================================
@Data
public class ErrorDto {
private String code;
private String message;
private String field;
}
====================================================================================
以下链接供参考:(逐步解释)
https://www.youtube.com/watch?v=OLt_CiNsu4A
选中/未选中异常的首选项就像宗教一样。
您通常不会在自己的代码中调用控制器方法。通常,您不会有如下代码:
try {
runClass.doSomething();
} catch(ExceptionRA exra) {
// Handle handle handle
}
因此,您不会直接从控制器方法抛出的已检查异常中获益。他们不会强制任何检查过的处理,因为没有地方处理它们。所以您也可以抛出未检查的异常,并缩短方法签名。从控制器方法中抛出已检查的异常没有任何附加值。
控制器正在调用的某些Busines服务方法也可能引发异常。这就引出了两个问题:
第一个问题的答案是——你不应该让这个决定受到你在控制器中所做的事情的影响。按照你的“例外宗教”去做。若您更喜欢选中的异常,那个么使用选中的异常,无论您是否在控制器中使用未选中的异常。
第二个问题是否定的。假设您的业务逻辑抛出检查异常。如果此异常将充分代表调用方的情况,则没有理由将其包装为任何其他异常,无论是选中还是未选中。如果您的业务异常没有向调用方正确解释情况,最好将其包装起来。然后,未经检查的异常将使您的签名更短。
现在是个人意见。除了编程错误之外,我通常更喜欢检查异常。我也在控制器中使用它们(更不用说有点长的方法签名)。
我正在使用quarkus版本,需要知道如何处理未知endpoint。当我试图命中尚未实现的endpoint时,它只会发送,而不是我希望实现的异常。我无法找到相同的实现。有人能帮我做这个吗?
我正在开发一个微服务,它基于存储在自己数据存储中的某些配置进行一些计算。计算API通过REST API存储。该应用程序是一个Spring启动应用程序。现在该应用程序主要有3层: Rest控制器 我计划使用以下几点来处理日志记录和异常处理: > 如果在DAO层或服务层中有任何已检查的异常,则记录它们并抛出从RuntimeException派生的自定义异常。 有几个自定义异常,当我们遇到无效值、空值等
问题内容: 我正在尝试建立一个大型的REST服务服务器。我们正在使用Spring Boot 1.2.1,Spring 4.1.5和Java8。我们的控制器正在实现@RestController和标准的@RequestMapping注释。 我的问题是Spring Boot为控制器异常设置了默认重定向到/error。从文档: Spring Boot默认提供一个/ error映射,以一种明智的方式处理所
我正在尝试建立一个大型的REST服务服务器。我们使用的是spring boot 1.2.1 spring 4.1.5和Java 8。我们的控制器实现了@RestController和标准的@RequestMapping注释。 我的问题是,spring boot将控制器异常设置为的默认重定向。从文档中: 默认情况下,spring boot提供了一个/error映射,它以一种合理的方式处理所有错误,并
问题内容: 如果我的Dao层抛出了Dao特定的异常,那么在我的服务层中对它们的处理是否会引起关注的泄漏?如果是,那么我应该使异常通用且独立于任何层来解决它,还是有其他方法吗? 相同的问题适用于服务层引发的UI层处理异常。 问题答案: 当我们创建一个分层的应用程序时,总是有一个用户层和另一个使用过的层。对于这种情况,UI层->使用服务层->使用DAO层。 现在,它非常主观并且易于解释。但目标应该是
我有一个WCF服务,它连接到一个服务总线队列,准备接收消息。这是工作很好,但我希望能够标记的消息作为一个死信,如果我有一个问题处理的消息。当前,如果我的代码抛出异常,消息仍然会从队列中删除,但我希望能够在配置中指定不从队列中删除,但将其标记为死信。我做了一些搜索,但我不知道怎么做。我当前正在将该服务作为windows服务运行 Uri baseAddress=ServiceBusEnvironmen