第十八章 服务

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返回的异常结果时, 会依次作出如下分析:

  1. 错误代码是否为-32098, 如果是则使用连接丢失的专用方法进行处理.
  2. 中断注册中是否已经有注册了该异常的专属处理方法,如果有,转入专属处理
  3. 在我们前面提到的异常标题列表中进行查找, 如果有,使用show_warning方法进行提示
  4. 否则,使用python异常的通用方法处理异常.

13.0+ 的引用方式时web.CrashManager, 但是12.0的引用方式为web.crash_manager.

results matching ""

    No results matching ""