我有一个数据迁移,如果发生某些情况,我实际上想回滚。
我知道迁移会自动包含在事务中,因此我只需引发异常即可安全,然后相信所有更改都会回滚。但是我应该引发哪个异常来中止我的 Django 数据迁移? 我应该写自己的例外,还是我可以接受
raise Exception('My message explaining the problem')
?
什么是最佳实践?
自定义异常将给出一个稍微更漂亮的消息。另一方面,迁移通常是一次性的,彼此之间或项目的其余部分基本上没有代码依赖关系,这意味着您无法重用异常类来确保每个迁移都是独立的。这里任何异常的唯一目的是提供即时反馈,因为它不会被任何东西捕获(除了生产环境中可能的错误记录......它实际上不应该失败)。
我认为缺点大于优点 - 只需提出一个简单的一次性
Exception
。
正确的方法是筹集
CommandError('My message explaining the problem')
(套餐django.core.management
)。
迁移是在命令内执行的,不同之处在于:如果使用任何其他异常类,结果将是相同的,但回溯将显示在用户的终端中,使得错误看起来像是错误的代码,但您确实故意引发异常,想要 (1) 停止代码 (2) 回滚任何更改以及 (3) 让用户知道原因,但没有理由显示回溯,因此使用
CommandError
在中止命令之前,将在没有回溯跟踪的情况下显示错误,如下所示:
CommandError: My message explaining the problem