当前位置: 首页 > 知识库问答 >
问题:

捕获所有异常并返回泽西中的自定义错误

楚弘益
2023-03-14
@Provider
public class ExceptionMapper implements javax.ws.rs.ext.ExceptionMapper<Exception> {
    private static Logger logger = LogManager.getLogManager().getLogger(ExceptionMapper.class.getName());

    @Override
    public Response toResponse(Exception e) {
        logger.log(Level.SEVERE, e.getMessage(), e);

        return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Internal error").type("text/plain").build();
    }
}
public MyResult getById(@PathParam("id")) {
    if (checkAnyThing) {
        return new MyResult();
    }
    else {
        throw new WebApplicationException(Response.Status.NOT_FOUND);
    }
}

这是由映射器捕获的。现在我要写:

public Response getById(@PathParam("id") {
    if (checkAnyThing) { {
        return Response.ok().entity(new MyResult()).build();
    }
    else {
        return Response.status(Response.Status.NOT_FOUND).build();
    }
}

这是捕捉所有意外异常并返回Jersey错误(错误代码)的正确方法吗?或者还有其他(更正确的)方式吗?

共有1个答案

谷梁楚青
2023-03-14

WebApplicationException有一个GetResponse,我们可以从中获取响应。因此可以在映射器中检查WebApplicationException。也许是像

@Override
public Response toResponse(Throwable error) {
    Response response;
    if (error instanceof WebApplicationException) {
        WebApplicationException webEx = (WebApplicationException)error;
        response = webEx.getResponse();
    } else {
        response = Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                .entity("Internal error").type("text/plain").build();
    }
    return response;
}

这样,抛出的WebApplicationException实例将只返回默认响应。这实际上还将处理一些其他异常,而不是由应用程序明确抛出的。WebApplicationException在其层次结构下还有一些其他由JAX-RS引发的异常,其中预定义的响应/状态代码被包装起来。

Exception                      Status code    Description
-------------------------------------------------------------------------------
BadRequestException            400            Malformed message
NotAuthorizedException         401            Authentication failure
ForbiddenException             403            Not permitted to access
NotFoundException              404            Couldn’t find resource
NotAllowedException            405            HTTP method not supported
NotAcceptableException         406            Client media type requested 
                                                            not supported
NotSupportedException          415            Client posted media type 
                                                            not supported
InternalServerErrorException   500            General server error
ServiceUnavailableException    503            Server is temporarily unavailable 
                                                            or busy

也就是说,我们可以在代码中显式地抛出任何这些异常,只是为了赋予它更多的语义价值。

 类似资料:
  • 问题内容: 我想在球衣休息服务中捕获所有意外的异常。因此我写了一个ExceptionMapper: 映射器实际上捕获了所有异常。因此,我不能写: 这是由映射器捕获的。现在我要写: 这是捕获所有意外异常并还返回球衣中的错误(错误代码)的正确方法吗?还是还有其他(更正确的)方法? 问题答案: 有一个我们可以从中得到的。因此,您可以在映射器中检查。也许像 这样,thrown 的实例将只返回默认响应。实际

  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 我有以下try块: 我想从捕获潜在的错误。经过反复试验,我能够生成一个潜在错误列表,这些错误可以通过打印它们的类型(e)由触发。__name__值: 但是如果我尝试将我的except语句从修改为,我将得到一个错误,即未定义。 我尝试定义一个类扩展为它,大多数教程/问题在这里建议,基本上: 现在这个变量已被识别,但由于我无法控制将引发的错误,因此我无法在我的初始try块中真正引发该异常。 理想情况下

  • 问题 怎样捕获代码中的所有异常? 解决方案 想要捕获所有的异常,可以直接捕获 Exception 即可: try: ... except Exception as e: ... log('Reason:', e) # Important! 这个将会捕获除了 SystemExit 、 KeyboardInterrupt 和 GeneratorExit 之外的所有异常。