From 0fd773a486fbc1aeef7f00ec5eab3eaf0e4c6a9d Mon Sep 17 00:00:00 2001 From: Goffin Simon Date: Thu, 18 Dec 2014 16:38:09 +0100 Subject: [IMP] Cleanup and refactoring of exception handling Unify and refactor exception handling in framework and addons. The generic `except_osv` is now deprecated, and replaced by more specialized exception subtypes: - `UserError` (renamed from Warning, as it conflicts with the built-in `Warning`) raised when a non-technical error occurs during a business operation. It could be a missing information in the data provided by the user, or a misconfiguration. - `AccessError`: raised when any operation is denied because the user conducting it does not have the required access rights. - `AccessDenied`: raised when an operation that requires authenticated access is attempted via an unauthenticated request. - `MissingError`: raised when an operation is attempted on a record that does not exist. - `ValidationError`: raised when an operation violates a SQL or Python constraint. - All other exceptions are internal errors due to a system problem or bug, and raised untouched to the client-side, which should display a traceback. All exceptions take a single message argument. The `test_exceptions` module has been updated to showcase both new and old (deprecated) exceptions. A great many old `except_osv` had a useless title with "Error!" or "Warning", those have been removed, as this is handled by the client-side widget that displays the messages. This commit introduces a more consistent policy for logging errors and warnings: - All messages that do not require administrator attention should be logged at INFO level or lower. This includes all errors that are notified to the user in a friendly manner, even for access right problems or validation errors during business operations. - All messages that indicate a likely misconfiguration or malicious use by the users should be logged at WARNING level, as they typically require administrator attention. - All other unhandled internal errors cannot typically be handled by the user and should be logged at ERROR or higher level, as they require immediate administrator attention. --- addons/base_import_module/models/ir_module.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'addons/base_import_module/models/ir_module.py') diff --git a/addons/base_import_module/models/ir_module.py b/addons/base_import_module/models/ir_module.py index 02965ef6074..3e35de2b0a1 100644 --- a/addons/base_import_module/models/ir_module.py +++ b/addons/base_import_module/models/ir_module.py @@ -8,6 +8,7 @@ import openerp from openerp.osv import osv from openerp.tools import convert_file from openerp.tools.translate import _ +from openerp.exceptions import UserError _logger = logging.getLogger(__name__) @@ -27,7 +28,7 @@ class view(osv.osv): unmet_dependencies = set(terp['depends']).difference(installed_mods) if unmet_dependencies: msg = _("Unmet module dependencies: %s") - raise osv.except_osv(_('Error !'), msg % ', '.join(unmet_dependencies)) + raise UserError(msg % ', '.join(unmet_dependencies)) mod = known_mods_names.get(module) if mod: @@ -79,7 +80,7 @@ class view(osv.osv): if not module_file: raise Exception("No file sent.") if not zipfile.is_zipfile(module_file): - raise osv.except_osv(_('Error !'), _('File is not a zip file!')) + raise UserError(_('File is not a zip file!')) success = [] errors = dict() @@ -88,7 +89,7 @@ class view(osv.osv): for zf in z.filelist: if zf.file_size > MAX_FILE_SIZE: msg = _("File '%s' exceed maximum allowed file size") - raise osv.except_osv(_('Error !'), msg % zf.filename) + raise UserError(msg % zf.filename) with openerp.tools.osutil.tempdir() as module_dir: z.extractall(module_dir) -- cgit v1.2.3