常规Spring(Boot)是否有办法进行全局异常处理,或者至少捕获任何未捕获的异常(例如可能随机发生的<record id="project_proposal_view_search" model="ir.ui.view">
<field name="name">project.part.search</field>
<field name="model">project.proposal</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="project_id"/>
<field name="code"/>
<filter name="code" string="Starts with 910" domain="[('code','ilike', '910')]"/>
</search>
</field>
</record>
class ProjectProposal(models.Model):
_name = 'project.proposal'
_inherit = ['mail.thread']
code = fields.Char(compute='_compute_code')
@api.multi
@api.onchange('project_id', 'object', 'stage_id', 'part_template_id')
def _compute_code(self):
for r in self:
code = []
if r.project_id:
code.append(r.project_id.code or '')
if r.object:
code.append(r.object or '')
if r.stage_id:
code.append(r.stage_id.code or '')
if r.part_template_id:
code.append(r.part_template_id.code or '')
r.code = '-'.join(code)
)?
我已经用Google搜索过,但我发现的所有内容都与控制器的RuntimeException
@ControllerAdvice
进行了对话。仅仅是一般的全局异常处理程序。
我基本上只是想确保如果发生了一些我没有抓到的异常,我就会记录它以便了解它。
答案 0 :(得分:1)
我认为spring并没有为此提供开箱即用的解决方案。
实现此目的的可能性是使用带注释的AOP(您可以在此处找到示例:Where can I catch non rest controller exceptions in spring?)。使用此方法,您可以为使用预定义注释注释的所有方法定义全局切入点。这种方法的好处是将所有错误处理逻辑放在一个地方。
答案 1 :(得分:0)
通过AOP添加你自己的东西,这样的东西会起作用:
@Aspect
@Component
public class ExceptionHandler {
@AfterThrowing(pointcut = "within(*.*)", throwing = "t")
public void log(Throwable t) {
t.printStackTrace();
}
}
查看cheat sheet以帮助切入点。
答案 2 :(得分:0)
最好扩展Spring的(300,300,3)
类并以所需的方式自定义它,例如:
ImageDataGenerator
这样,您可以覆盖Spring的默认错误响应主体,声明自定义异常(例如ResponseEntityExceptionHandler
),并允许Spring处理在import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import javax.validation.ValidationException;
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(ValidationException.class)
protected ResponseEntity<Object> handle(ValidationException ex) {
return new ResponseEntity<>(getError(HttpStatus.BAD_REQUEST, ex), new HttpHeaders(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler
protected ResponseEntity<Object> handle(Exception ex, WebRequest request) {
try {
return super.handleException(ex, request);
} catch (Exception e) {
return handleExceptionInternal(ex, null, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR, request);
}
}
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, @Nullable Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
if (HttpStatus.Series.SERVER_ERROR == status.series()) {
log.error("Unexpected error.", ex);
}
return new ResponseEntity<>(getError(status, ex), headers, status);
}
private ApiError getError(HttpStatus status, Exception ex) {
return ApiError.builder()
.status(status.value())
.message(ex.getMessage())
.build();
}
}
中声明的默认异常。
请注意,尽管在Spring 4.x中不需要在
ValidationException
周围进行try-catch,但由于底层ResponseEntityExceptionHandler
实现的更改,在Spring 5.x中是必需的。