@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错误(错误代码)的正确方法吗?或者还有其他(更正确的)方式吗?
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 之外的所有异常。