Odoo 18中的错误管理包括了解系统如何处理异常和错误,并采用良好的实践方法来有效地管理和解决这些问题。在错误跟踪和管理过程中,系统需要从底层理解并追溯错误,然后解决它们。
Odoo 18中常见的标准异常包括属性错误(AttributeError)、值错误(ValueError)、类型错误(TypeError)、验证错误(ValidationError)等。
抛出异常
在某些条件下,Odoo 18 会抛出异常,以确保系统按预期运行。异常可能由于多种原因触发,例如无效的用户输入、违反验证条件、记录缺失等。基于这些原因,产生了各种类型的异常。
1、验证错误(ValidationError)
我们可以根据需要在Odoo中使用ValidationError抛出异常。
例如,如果stock.picking模型中的partner_id字段(即“接收自”)未填写,则可以抛出验证错误。
from odoo import models
from odoo.exceptions import ValidationError
class StockPicking(models.Model):
_inherit ='stock.picking'
def button_validate(self):
result = super(StockPicking, self).button_validate()
if not self.partner_id:
raise ValidationError('请填写“接收自”字段')
return result
这样,每当我们尝试在未填写 “接收自” 字段的情况下验证库存调拨时,就会显示如下内容:
2、UserError(用户错误)
同样,也可以根据系统对每条记录进行检查所需的约束或条件抛出用户错误(UserError)。这需要从 “odoo.exceptions” 导入 “UserError”,我们可以将前面的代码替换如下,以展示工作流程。
from odoo import models
from odoo.exceptions import UserError
class StockPicking(models.Model):
_inherit ='stock.picking'
def button_validate(self):
result = super(StockPicking, self).button_validate()
if not self.partner_id:
raise UserError('请填写“接收自”字段!')
return result
当条件满足时,异常会弹出如下:
3、AccessError(访问错误)
接下来,让我们看看在 Odoo 18 中访问被拒警告是如何运行的。当用户尝试使用无效的登录详细信息登录到 Odoo 实例时,会使用此异常。首先,我们需要导入 “AccessError”,如下:
from odoo.exceptions import AccessError
现在,让我们编写一个简单的 Python 代码,阻止除管理员之外的所有用户访问某个文档。
if not self.env.is_admin():
raise AccessError(_("抱歉,您无权访问此文档。"))
当管理员之外的用户访问时:
4、缺失错误(MissingError)
在 Odoo 18 中,当用户尝试访问实例数据库中实际不存在的任何记录或数据时,通常会出现这些缺失错误(MissingError)。这些记录可能已被删除,或者根本不存在。
在前面验证库存调拨的示例代码中,让我们尝试使用随机 ID(例如 1000)访问任何记录,如下:
def button_validate(self):
result = super(StockPicking, self).button_validate()
print(self.browse(1000).name)
return result
这里,“stock.picking (1000,)” 是一个不存在的记录,因此,在点击 “验证” 按钮时,它将弹出 Odoo 18 的内置异常,如下:
我们可以先从 “odoo.exceptions” 导入 “MissingError” 异常,然后如下抛出它,来添加我们自己的缺失错误异常。
from odoo import models
from odoo.exceptions import MissingError
class StockPicking(models.Model):
_inherit = 'stock.picking'
def button_validate(self):
raise MissingError('Missing Error Demo')
return super(StockPicking, self).button_validate()
它将简单地抛出一个缺失错误,如下:
5、AccessDenied(访问被拒绝)
当用户由于访问权限限制而尝试执行其不被允许的操作时,会触发此异常。这类错误常用于维护数据安全性,并且可以根据为相关模块设置的用户组来实现。
例如:
from odoo import models
from odoo.exceptions import AccessDenied
class StockPicking(models.Model):
_inherit ='stock.picking'
def button_validate(self):
if not self.env.is_admin():
raise AccessDenied("您无权验证此操作")
return super(StockPicking, self).button_validate()
在这里,除管理员之外的任何用户,都将被拒绝验证库存移动的权限。让我们以任何没有管理员权限的内部用户身份登录系统,并尝试验证库存调拨。将会出现如下错误:
权限不足、访问控制列表(ACL)配置错误、记录规则受限、需要超级用户权限等,都可能是导致访问被拒的原因。
6、CacheMiss(缓存未命中)
当找不到记录或数据时,Odoo 会抛出这种类型的错误。Odoo 通常会在一段时间内缓存最近访问过的记录数据。当在缓存中找不到所需记录时,就会发生缓存未命中(CacheMiss)。这可能是由于流量过大或允许的内存限制导致的。
country = self.env['res.country'].browse(1)
print(country.name) # 此访问将命中缓存,无需数据库查询
在这里,第一行中,“country” 变量有一个值。Odoo 从数据库中获取它并将其存储在缓存中。在第二行中,打印 “country.name”。此时,Odoo 将从缓存中返回它,而无需像第一行那样再次运行数据库查询。
如果在缓存中找不到,将弹出缓存未命中异常。
7、RedirectWarning(重定向警告)
重定向警告(RedirectWarning)可用于将工作流程重定向到特定页面,而不是向用户发出任何警告。也就是说,可能存在一些需求,例如需要将用户重定向到另一个向导或操作。在这种情况下,重定向警告对于建议应遵循的替代流程很有用,例如确认操作或在继续原始操作之前重定向到表单视图。
重定向警告的必要参数有:
- action_id:执行重定向的操作 ID。
- message:异常消息。
- button_text:触发重定向的按钮上显示的文本。
在我们之前验证库存调拨的示例中,我们已经对 “button_validate ()” 方法进行了扩展,现在让我们在该方法中演示重定向警告,如下:
from odoo import _, models
from odoo.exceptions import RedirectWarning
class StockPicking(models.Model):
_inherit = 'stock.picking'
def button_validate(self):
warehouse_action = self.env.ref('stock.action_warehouse_form')
msg = _('Please create a warehouse for company %s.',
self.env.company.display_name)
raise RedirectWarning(msg, warehouse_action.id, _('Go to Warehouses'))
return super(StockPicking, self).button_validate()
在这里,在验证库存调拨时,系统将生成一个重定向警告,在主体中显示一条消息,并带有两个按钮,分别名为 “转到仓库” 和 “关闭”。点击前者,控制权将转到仓库创建页面或已创建的仓库页面。异常如下:
点击 “转到仓库” 按钮时,我们将看到如下页面:
Odoo 提供了一套全面的异常,开发人员可以使用这些异常来处理各种场景,例如数据验证问题、访问控制违规、记录未找到,甚至是需要重定向的复杂工作流程。正确使用这些异常有助于确保应用程序可预测地运行,并在出现问题时向用户提供清晰的反馈。