异常控制

任何HTTP请求都不可能保证完全正确没有错误,服务端可以推送错误到客户端,但有时又需要隐藏掉服务端的错误。Sanic提供的异常控制功能主要包括从处理函数中抛出一个异常和服务出现异常时的捕获。Sanic中的异常功能都在sanic.exceptions包中提供。

要从服务端抛出一个异常,只需要在处理函数中发起一个sanic.exceptions包中的异常即可。sanic.exceptions包中可用的异常主要有以下这些。

  • ContentRangeError(message, content_rage),HTTP 416错误。
  • FileNotFound(message, path, relative_url),HTTP 404错误,但指示找不到指定文件。
  • Forbidden(message),HTTP 403错误。
  • HeaderExpectationFailed(message),HTTP 417错误。
  • HeaderNotFound(message),HTTP头未找到错误。
  • InvalidRangeType(message, content_range),无效范围错误。
  • InvalidUsage(message),HTTP 400错误。
  • MethodNotSupported(message, method, allowed_methods),HTTP 405错误,请求方法不被支持。
  • NotFound(message),HTTP 404错误。
  • PayloadTooLarge(message),HTTP 413错误。
  • RequestTimeout(message),HTTP 408错误。
  • ServerError(message),HTTP 500错误。
  • ServiceUnavailable(message),HTTP 503错误。
  • URLBuildError(message),URL构造错误。
  • Unauthorized(message, status_code, scheme, **kwargs),HTTP 401错误,kwargs参数用于填充WWW-Authentication头。

以上列表中大部分异常类还可以接受一个status_code参数用来改变其HTTP错误码,但这种行为可能会造成HTTP语义被破坏,故不提倡使用。

此外还可以用sanic.exceptions包中提供的函数abort(status_code, message)快速抛出一个自定义的HTTP错误。

以下是两种抛出异常的示例。

@app.route("/some-error")
async def ready_to_error(request):
	raise ServerError("Not good")

@app.route("/not-pass")
async def not_pass(request):
	abort(401)

当服务出现异常时,如果不需要将其推向客户端,则可以使用异常捕获来进行处理。Sanic类提供了修饰器.exception()来捕获指定类型的异常,或者使用.error_handler属性来添加异常处理函数。

以下给出两种异常捕获的方法的示例。

# 修饰器接受一个 sanic.exceptions 包中的类作为参数
@app.exception(NotFound)
async def process_404(request, exception):
	return text("Page not found")


async def handle_server_exception(request, exception):
	return text("Something bad happens")

app.error_handler.add(ServerError, handle_server_exception)