diff --git a/docs/source/en/core/error-handling.md b/docs/source/en/core/error-handling.md
index e18cf14ead..2fe5304be7 100644
--- a/docs/source/en/core/error-handling.md
+++ b/docs/source/en/core/error-handling.md
@@ -59,8 +59,8 @@ For convenience of locating problems, exceptions must be guaranteed to be Error
| HTML & TEXT | local & unittest | - | onerror built-in error page |
| HTML & TEXT | others | YES | redirect to errorPageUrl |
| HTML & TEXT | others | NO | onerror built-in error page(simple, not recommended) |
-| JSON | local & unittest | - | JSON Object with details |
-| JSON | others | - | JSON object without details |
+| JSON & JSONP | local & unittest | - | JSON Object or JSONP response body with details |
+| JSON & JSONP| others | - | JSON object or JSONP response body without details |
### errorPageUrl
@@ -78,38 +78,31 @@ module.exports = {
## Create your universal exception handler
-Once the default handler no longer meet your needs, you still can leverage Middleware to create a new handler.
-
-As following implementation, you can create a new file in `app/middleware`, for example `error_handler.js`:
-
-```js
-// app/middleware/error_handler.js
-module.exports = () => {
- return function* errorHandler(next) {
- try {
- yield next;
- } catch (err) {
- // `app.emit('error', err, this)` should be invoked after exceptions are caught
- // Exceptions will be caught and printed out.
- this.app.emit('error', err, this);
- // Composing the object in handler when exceptions are thrown
- this.body = {
- success: false,
- message: this.app.config.env === 'prod' ? 'Internal Server Error' : err.message,
- };
- }
- };
-};
-```
-
-Adding your customized `error_handler` in `config/config.default.js`:
+Once the default handler no longer meet your needs, you still can customize your owner error handler by onerror's configurations.
```js
+// config/config.default.js
module.exports = {
- middleware: [ 'errorHandler' ],
- errorHandler: {
- // errorHandler only handle exceptions from requests under /api/, and onerror will do the same things for the rest.
- match: '/api',
+ onerror: {
+ all(err, ctx) {
+ // Define an error handler for all type of Response.
+ // Once config.all present, other type of error handers will be ignored.
+ this.body = 'error';
+ this.status = 500;
+ },
+ html(err, ctx) {
+ // html hander
+ this.body = '
error
';
+ this.status = 500;
+ },
+ json(err, ctx) {
+ // json hander
+ this.body = { message: 'error' };
+ this.status = 500;
+ },
+ jsonp(err, ctx) {
+ // Generally, we don't need to customize jsonp error handler.
+ // It will call json error handler and wrap to jsonp type response.
},
};
```
@@ -167,4 +160,4 @@ Adding yours to `middleware` in config:
module.exports = {
middleware: [ 'notfoundHander' ],
};
-```
\ No newline at end of file
+```
diff --git a/docs/source/zh-cn/core/error-handling.md b/docs/source/zh-cn/core/error-handling.md
index cd56e5874f..192e8efcbc 100644
--- a/docs/source/zh-cn/core/error-handling.md
+++ b/docs/source/zh-cn/core/error-handling.md
@@ -58,8 +58,8 @@ exports.buy = function* (ctx) {
| HTML & TEXT | local & unittest | - | onerror 自带的错误页面,展示详细的错误信息 |
| HTML & TEXT | 其他 | 是 | 重定向到 errorPageUrl |
| HTML & TEXT | 其他 | 否 | onerror 自带的没有错误信息的简单错误页(不推荐) |
-| JSON | local & unittest | - | JSON 对象,带详细的错误信息 |
-| JSON | 其他 | - | json 对象,不带详细的错误信息 |
+| JSON & JSONP | local & unittest | - | JSON 对象或对应的 JSONP 格式响应,带详细的错误信息 |
+| JSON & JSONP | 其他 | - | JSON 对象或对应的 JSONP 格式响应,不带详细的错误信息 |
### errorPageUrl
@@ -79,38 +79,31 @@ module.exports = {
## 自定义统一异常处理
-尽管框架提供了默认的统一异常处理机制,但是应用开发中经常需要对异常时的响应做自定义,特别是在做一些接口开发的时候。这时我们可以通过自定义[中间件](../basics/middleware.md)的方式来自行定义统一的异常处理函数。
-
-例如我们可以在 `app/middleware` 中新增一个 `error_handler.js` 的文件
-
-```js
-// app/middleware/error_handler.js
-module.exports = () => {
- return function* errorHandler(next) {
- try {
- yield next;
- } catch (err) {
- // 注意:自定义的错误统一处理函数捕捉到错误后也要 `app.emit('error', err, this)`
- // 框架会统一监听,并打印对应的错误日志
- this.app.emit('error', err, this);
- // 自定义错误时异常返回的格式
- this.body = {
- success: false,
- message: this.app.config.env === 'prod' ? 'Internal Server Error' : err.message,
- };
- }
- };
-};
-```
-
-然后在 `config/config.default.js` 中引入这个中间件
+尽管框架提供了默认的统一异常处理机制,但是应用开发中经常需要对异常时的响应做自定义,特别是在做一些接口开发的时候。框架自带的 onerror 插件支持自定义配置错误处理方法,可以覆盖默认的错误处理方法。
```js
+// config/config.default.js
module.exports = {
- middleware: [ 'errorHandler' ],
- errorHandler: {
- // 非 `/api/` 路径不在这里做错误处理,留给默认的 onerror 插件统一处理
- match: '/api',
+ onerror: {
+ all(err, ctx) {
+ // 在此处定义针对所有响应类型的错误处理方法
+ // 注意,定义了 config.all 之后,其他错误处理方法不会再生效
+ this.body = 'error';
+ this.status = 500;
+ },
+ html(err, ctx) {
+ // html hander
+ this.body = 'error
';
+ this.status = 500;
+ },
+ json(err, ctx) {
+ // json hander
+ this.body = { message: 'error' };
+ this.status = 500;
+ },
+ jsonp(err, ctx) {
+ // 一般来说,不需要特殊针对 jsonp 进行错误定义,jsonp 的错误处理会自动调用 json 错误处理,并包装成 jsonp 的响应格式
+ },
},
};
```