3c4bfd1dec
This commit adds the errno attribute to exceptions, so code can retrieve errno codes from an OSError using exc.errno. The implementation here simply lets `errno` (and the existing `value`) attributes work on any exception instance (they both alias args[0]). This is for efficiency and to keep code size down. The pros and cons of this are: Pros: - more compatible with CPython, less difference to document and learn - OSError().errno will correctly return None, whereas the current way of doing it via OSError().args[0] will raise an IndexError - it reduces code size on most bare-metal ports (because they already have the errno qstr) - for Python code that uses exc.errno the generated bytecode is 2 bytes smaller and more efficient to execute (compared with exc.args[0]); so bytecode loaded to RAM saves 2 bytes RAM for each use of this attribute, and bytecode that is frozen saves 2 bytes flash/ROM for each use - it's easier/shorter to type, and saves 2 bytes of space in .py files that use it (for each use) Cons: - increases code size by 4-8 bytes on minimal ports that don't already have the `errno` qstr - all exceptions now have .errno and .value attributes (a cpydiff test is added to address this) See also #2407. Signed-off-by: Damien George <damien@micropython.org>
35 lines
1004 B
ReStructuredText
35 lines
1004 B
ReStructuredText
:mod:`uerrno` -- system error codes
|
|
===================================
|
|
|
|
.. module:: uerrno
|
|
:synopsis: system error codes
|
|
|
|
|see_cpython_module| :mod:`python:errno`.
|
|
|
|
This module provides access to symbolic error codes for `OSError` exception.
|
|
A particular inventory of codes depends on :term:`MicroPython port`.
|
|
|
|
Constants
|
|
---------
|
|
|
|
.. data:: EEXIST, EAGAIN, etc.
|
|
|
|
Error codes, based on ANSI C/POSIX standard. All error codes start with
|
|
"E". As mentioned above, inventory of the codes depends on
|
|
:term:`MicroPython port`. Errors are usually accessible as ``exc.errno``
|
|
where ``exc`` is an instance of `OSError`. Usage example::
|
|
|
|
try:
|
|
uos.mkdir("my_dir")
|
|
except OSError as exc:
|
|
if exc.errno == uerrno.EEXIST:
|
|
print("Directory already exists")
|
|
|
|
.. data:: errorcode
|
|
|
|
Dictionary mapping numeric error codes to strings with symbolic error
|
|
code (see above)::
|
|
|
|
>>> print(uerrno.errorcode[uerrno.EEXIST])
|
|
EEXIST
|