Spring Boot Exception详细信息

时间:2017-07-27 09:14:52

标签: spring-boot exception-handling

我正在尝试在基于Spring boot的Web服务中记录异常。

所以我使用了 GlobalExceptionHandler 我的代码:

@ControllerAdvice  
@RestController  
public class GlobalExceptionHandler {  

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  
    @ExceptionHandler(value = Exception.class)
    public String handleException(Exception e){

        System.out.println("Ankit == "+e.getMessage());
        StringWriter errors = new StringWriter();
        e.printStackTrace(new PrintWriter(errors));
        System.out.println(errors.toString());
        return e.getMessage();
    }
 }

代码工作正常。我想要的是异常细节。我的意思是发生异常的代码?文件名/行?或者我必须解析堆栈跟踪?我的意思是春季靴子一定是想到这个吗?

1 个答案:

答案 0 :(得分:-2)

使用IDE

如果您使用的是任何IDE,请转到Console Window

  1. 清除控制台
  2. 重复导致异常的操作
  3. Console(CTRL + F)中搜索ERROR
  4. 查找上面的行(如果您不能立即找到上面的行,请查找2-3行)包含ERROR的行。此行包含发生异常的Class,Method的详细信息。
  5. 不查看控制台或日志

    如果你想在生产中使用它,那么处理至少已知的异常(如BAD_REQUEST,NOT_FOUND等)下面的方式可能会有所帮助(向Exception Class添加额外的参数)

    Employee employee = employeeService.getEmployeeById(employeeId);
    if (null == employee) {
    logger.error("No tenant exists for employeeId:"+employeeId);
    throw new ObjectNotFoundException("Emplyee Not Found",  this.getClass().getSimpleName();));
    }
    

    此处this.getClass().getSimpleName();将作为EmployeeController类的参数传递。因此,在ObjectNotFoundException我们可以添加参数ClassName,当您在GlobalExceptionHandler中处理它时,您可以按照以下步骤进行操作,

    @ControllerAdvice  
    @RestController  
    public class GlobalExceptionHandler {  
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  
        @ExceptionHandler(value = Exception.class)
        public String handleException(Exception e){
    
            System.out.println("Ankit == "+e.getMessage());
            StringWriter errors = new StringWriter();
            e.printStackTrace(new PrintWriter(errors));
            String classWithExceptionName = e.getClassName(); 
            // you need to add this above getter method to your Exception Class
            System.out.println(errors.toString());
            return e.getMessage();
        }
     }
    

    这是针对已知的常见例外情况。我们需要将extra parameter(ClassName)添加到您正在抛出的所有自定义异常中,这可能是一些额外的代码,但我认为这是方法。希望现在有所帮助。