我想问为什么我们不必添加try-catch块一段RuntimeException时间我们应该用其他异常来做?
我的意思是:
public class Main {
public static void main(String[] args) {
throw new RuntimeException();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:当我说:throw new RuntimeException();很明显会发生异常,为什么编译器不禁止这样做?
Spring Boot(mvc)中是否有一种方法可以记录自定义异常并抛出它,而不会在日志文件中看到它的堆栈跟踪?但是对于任何其他异常仍然会看到堆栈跟踪.
很长的解释:
我正在使用spring boot创建一个简单的休息服务.我喜欢自定义异常,默认情况下日志中没有堆栈跟踪,并且使用基本异常详细信息(状态,错误,消息)创建了json响应.
问题是它根本没有创建日志条目,因此我必须手动执行此操作:
自定义例外
@ResponseStatus(value = HttpStatus.CONFLICT)
public class DuplicateFoundException extends RuntimeException {
public DuplicateFoundException(String message) {
super(message);
}
}
Run Code Online (Sandbox Code Playgroud)
抛出服务方法的异常(在@RestController中)
if (!voteDao.findByItemAndUser(item, voteDto.getUserId()).isEmpty()) {
log.warn("... already voted ..."); //TODO: don't do this for every throw
throw new DuplicateFoundException("... already voted ...");
}
Run Code Online (Sandbox Code Playgroud)
有更多的异常导致在每次抛出之前放置日志语句,这是一种我认为不好的方法.我已经尝试从服务方法中删除所有日志语句并创建了@ControlledAdvice,我将记录所有自定义异常并重新抛出它们,所以我仍然像以前一样得到好的json:
@ControllerAdvice
public class RestExceptionHandler {
private static final Logger log = Logger.getLogger(RestExceptionHandler.class);
@ExceptionHandler
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if …Run Code Online (Sandbox Code Playgroud) 我想知道其他SOers在实践中如何处理和/或防止异常.
在什么情况下你会阻止例外,以及如何?在什么情况下你会捕获异常?
我通常会通过,基本上说,阻止'NullPointerExceptions'(和其他类似的) if(foo!=null) {...}
我发现在大多数情况下,这比使用try-catch块所涉及的所有内容都要小.
当潜在的异常更复杂或更多时,我使用try-catch块.