第十八章 服务
WC中的服务是指提供了若干实用功能的服务集合,比如Ajax服务,session服务,存储服务等, 本章我们将详细了解WC中的各种服务.
Crash Manager
Crash Manager服务(以下简称CM服务)作用于系统发生异常时弹窗提示.
我们在*引用CM服务的时候会得到以下三个对象:
- CrashManager
- ErrorDialog
- WarningDialog
CrashManager
CM服务的核心部件,继承自抽象服务, 因此抽象服务所拥有的属性CrashManager都拥有.
异常标题
CrashManager内部对异常进行了分类,每种不同的异常,都有相应不同的标题, 具体来说有以下几种:
- MailDeliveryException: 邮件发送异常
- Access Denied: 访问被拒绝
- Access Error: 访问异常
- Missing Record: 缺少记录(不存在的记录)
- User Error: 用户异常
- Validation Error: 验证异常
- Warning:警告
看到这些标题,应该有同学猜到了,我们平时所经常用到的UserError, AccessError等提醒,都是通过CM服务来完成的.那么我们平时所用的这些方法具体是如何实现的呢?那就需要用到CM的rpc_error方法了.
rpc_error
我们来详细看一下rpc_error方法的代码:
rpc_error: function(error) {
// Some qunit tests produces errors before the DOM is set.
// This produces an error loop as the modal/toast has no DOM to attach to.
if (!document.body || !active || this.connection_lost) return;
// Connection lost error
if (error.code === -32098) {
this.handleLostConnection();
return;
}
// Special exception handlers, see crash_registry bellow
var handler = core.crash_registry.get(error.data.name, true);
if (handler) {
new (handler)(this, error).display();
return;
}
// Odoo custom exception: UserError, AccessError, ...
if (_.has(this.odooExceptionTitleMap, error.data.name)) {
error = _.extend({}, error, {
data: _.extend({}, error.data, {
message: error.data.arguments[0],
title: this.odooExceptionTitleMap[error.data.name],
}),
});
this.show_warning(error);
return;
}
// Any other Python exception
this.show_error(error);
},
我们从代码上可以看出, rpc_error方法接收一个参数, 该参数是前面使用rpc方法回调出来的异常结果, 也就是我们使用UserError, AccessError等类封装后的json结果.这里我们简单展示一个示例:
{
"code": 200,
"message": "Odoo Server Error",
"data": {
"name": "odoo.exceptions.AccessDenied",
"debug": "Traceback (most recent call last):...",
"message": "没有更多作者了",
"arguments": [
"没有更多作者了"
],
"context": {},
"title": {}
}
}
其中, name是我们返回的异常的名字, debug是异常堆栈, message是异常文本. 我们从中可以看出, 当odoo拿到rpc返回的异常结果时, 会依次作出如下分析:
- 错误代码是否为-32098, 如果是则使用连接丢失的专用方法进行处理.
- 中断注册中是否已经有注册了该异常的专属处理方法,如果有,转入专属处理
- 在我们前面提到的异常标题列表中进行查找, 如果有,使用show_warning方法进行提示
- 否则,使用python异常的通用方法处理异常.
13.0+ 的引用方式时web.CrashManager, 但是12.0的引用方式为web.crash_manager.