diff options
author | Rachel Dowdall <rjdowdall@gmail.com> | 2014-03-22 15:28:16 +0000 |
---|---|---|
committer | Rachel Dowdall <rjdowdall@gmail.com> | 2014-03-22 15:28:16 +0000 |
commit | 721c55dced099a797f0910839c7c4f9ac7599ed4 (patch) | |
tree | 256841f59ea9d6ff0a9a5fb864b56774b6b67781 /py | |
parent | 249b9c761d1fa0893740092df1d713ce0d91e856 (diff) | |
download | micropython-721c55dced099a797f0910839c7c4f9ac7599ed4.tar.gz micropython-721c55dced099a797f0910839c7c4f9ac7599ed4.zip |
Added exception hierarchy except for OSError and UnicodeError (requires arguments). Comment out the errors that aren't needed if memory becomes an issue.
Diffstat (limited to 'py')
-rw-r--r-- | py/obj.h | 48 | ||||
-rw-r--r-- | py/objexcept.c | 87 | ||||
-rw-r--r-- | py/qstrdefs.h | 45 | ||||
-rw-r--r-- | py/runtime.c | 36 |
4 files changed, 192 insertions, 24 deletions
@@ -184,9 +184,53 @@ struct _mp_obj_type_t { typedef struct _mp_obj_type_t mp_obj_type_t; // Constant types, globally accessible - extern const mp_obj_type_t mp_type_type; + +// Exceptions extern const mp_obj_type_t mp_type_BaseException; +extern const mp_obj_type_t mp_type_ArithmeticError; +extern const mp_obj_type_t mp_type_AssertionError; +extern const mp_obj_type_t mp_type_AttributeError; +extern const mp_obj_type_t mp_type_BufferError; +extern const mp_obj_type_t mp_type_BytesWarning; +extern const mp_obj_type_t mp_type_DeprecationWarning; +extern const mp_obj_type_t mp_type_EOFError; +extern const mp_obj_type_t mp_type_EnvironmentError; +extern const mp_obj_type_t mp_type_Exception; +extern const mp_obj_type_t mp_type_FloatingPointError; +extern const mp_obj_type_t mp_type_FutureWarning; +extern const mp_obj_type_t mp_type_GeneratorExit; +extern const mp_obj_type_t mp_type_IOError; +extern const mp_obj_type_t mp_type_ImportError; +extern const mp_obj_type_t mp_type_ImportWarning; +extern const mp_obj_type_t mp_type_IndentationError; +extern const mp_obj_type_t mp_type_IndexError; +extern const mp_obj_type_t mp_type_KeyError; +extern const mp_obj_type_t mp_type_LookupError; +extern const mp_obj_type_t mp_type_MemoryError; +extern const mp_obj_type_t mp_type_NameError; +extern const mp_obj_type_t mp_type_NotImplementedError; +extern const mp_obj_type_t mp_type_OSError; +extern const mp_obj_type_t mp_type_OverflowError; +extern const mp_obj_type_t mp_type_PendingDeprecationWarning; +extern const mp_obj_type_t mp_type_ReferenceError; +extern const mp_obj_type_t mp_type_ResourceWarning; +extern const mp_obj_type_t mp_type_RuntimeError; +extern const mp_obj_type_t mp_type_RuntimeWarning; +extern const mp_obj_type_t mp_type_SyntaxError; +extern const mp_obj_type_t mp_type_SyntaxWarning; +extern const mp_obj_type_t mp_type_SystemError; +extern const mp_obj_type_t mp_type_SystemExit; +extern const mp_obj_type_t mp_type_TabError; +extern const mp_obj_type_t mp_type_TypeError; +extern const mp_obj_type_t mp_type_UnboundLocalError; +extern const mp_obj_type_t mp_type_UserWarning; +extern const mp_obj_type_t mp_type_ValueError; +extern const mp_obj_type_t mp_type_Warning; +extern const mp_obj_type_t mp_type_ZeroDivisionError; + +extern const mp_obj_type_t mp_type_StopIteration; +/*extern const mp_obj_type_t mp_type_BaseException; extern const mp_obj_type_t mp_type_AssertionError; extern const mp_obj_type_t mp_type_AttributeError; extern const mp_obj_type_t mp_type_ImportError; @@ -201,7 +245,7 @@ extern const mp_obj_type_t mp_type_OverflowError; extern const mp_obj_type_t mp_type_OSError; extern const mp_obj_type_t mp_type_NotImplementedError; extern const mp_obj_type_t mp_type_StopIteration; -extern const mp_obj_type_t mp_type_ZeroDivisionError; +extern const mp_obj_type_t mp_type_ZeroDivisionError;*/ // Constant objects, globally accessible diff --git a/py/objexcept.c b/py/objexcept.c index 3f636ffc6d..7fd783b3a4 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -77,23 +77,78 @@ const mp_obj_type_t mp_type_ ## exc_name = { \ .bases_tuple = (mp_obj_t)&mp_type_ ## base_name ## _base_tuple, \ }; +// List of all exceptions, arranged as in the table at: +// http://docs.python.org/3.3/library/exceptions.html MP_DEFINE_EXCEPTION_BASE(BaseException) - -MP_DEFINE_EXCEPTION(AssertionError, BaseException) -MP_DEFINE_EXCEPTION(AttributeError, BaseException) -MP_DEFINE_EXCEPTION(ImportError, BaseException) -MP_DEFINE_EXCEPTION(IndentationError, BaseException) -MP_DEFINE_EXCEPTION(IndexError, BaseException) -MP_DEFINE_EXCEPTION(KeyError, BaseException) -MP_DEFINE_EXCEPTION(NameError, BaseException) -MP_DEFINE_EXCEPTION(SyntaxError, BaseException) -MP_DEFINE_EXCEPTION(TypeError, BaseException) -MP_DEFINE_EXCEPTION(ValueError, BaseException) -MP_DEFINE_EXCEPTION(OverflowError, BaseException) -MP_DEFINE_EXCEPTION(OSError, BaseException) -MP_DEFINE_EXCEPTION(NotImplementedError, BaseException) -MP_DEFINE_EXCEPTION(StopIteration, BaseException) -MP_DEFINE_EXCEPTION(ZeroDivisionError, BaseException) +MP_DEFINE_EXCEPTION(SystemExit, BaseException) +//MP_DEFINE_EXCEPTION(KeyboardInterrupt, BaseException) +MP_DEFINE_EXCEPTION(GeneratorExit, BaseException) +MP_DEFINE_EXCEPTION(Exception, BaseException) + MP_DEFINE_EXCEPTION_BASE(Exception) + MP_DEFINE_EXCEPTION(StopIteration, Exception) + MP_DEFINE_EXCEPTION(ArithmeticError, Exception) + MP_DEFINE_EXCEPTION_BASE(ArithmeticError) + MP_DEFINE_EXCEPTION(FloatingPointError, ArithmeticError) + MP_DEFINE_EXCEPTION(OverflowError, ArithmeticError) + MP_DEFINE_EXCEPTION(ZeroDivisionError, ArithmeticError) + MP_DEFINE_EXCEPTION(AssertionError, Exception) + MP_DEFINE_EXCEPTION(AttributeError, Exception) + MP_DEFINE_EXCEPTION(BufferError, Exception) + MP_DEFINE_EXCEPTION(EnvironmentError, Exception) + MP_DEFINE_EXCEPTION(EOFError, Exception) + MP_DEFINE_EXCEPTION(ImportError, Exception) + MP_DEFINE_EXCEPTION(IOError, Exception) + MP_DEFINE_EXCEPTION(LookupError, Exception) + MP_DEFINE_EXCEPTION_BASE(LookupError) + MP_DEFINE_EXCEPTION(IndexError, LookupError) + MP_DEFINE_EXCEPTION(KeyError, LookupError) + MP_DEFINE_EXCEPTION(MemoryError, Exception) + MP_DEFINE_EXCEPTION(NameError, Exception) + MP_DEFINE_EXCEPTION_BASE(NameError) + MP_DEFINE_EXCEPTION(UnboundLocalError, NameError) + MP_DEFINE_EXCEPTION(OSError, Exception) + // Probably don't need these + /*MP_DEFINE_EXCEPTION_BASE(OSError) + MP_DEFINE_EXCEPTION(BlockingIOError, OSError) + MP_DEFINE_EXCEPTION(ChildProcessError, OSError) + MP_DEFINE_EXCEPTION(ConnectionError, OSError) + MP_DEFINE_EXCEPTION(BrokenPipeError, ConnectionError) + MP_DEFINE_EXCEPTION(ConnectionAbortedError, ConnectionError) + MP_DEFINE_EXCEPTION(ConnectionRefusedError, ConnectionError) + MP_DEFINE_EXCEPTION(ConnectionResetError, ConnectionError) + MP_DEFINE_EXCEPTION(FileExistsError, OSError) + MP_DEFINE_EXCEPTION(FileNotFoundError, OSError) + MP_DEFINE_EXCEPTION(InterruptedError, OSError) + MP_DEFINE_EXCEPTION(IsADirectoryError, OSError) + MP_DEFINE_EXCEPTION(NotADirectoryError, OSError) + MP_DEFINE_EXCEPTION(PermissionError, OSError) + MP_DEFINE_EXCEPTION(ProcessLookupError, OSError) + MP_DEFINE_EXCEPTION(TimeoutError, OSError)*/ + MP_DEFINE_EXCEPTION(ReferenceError, Exception) + MP_DEFINE_EXCEPTION(RuntimeError, Exception) + MP_DEFINE_EXCEPTION_BASE(RuntimeError) + MP_DEFINE_EXCEPTION(NotImplementedError, RuntimeError) + MP_DEFINE_EXCEPTION(SyntaxError, Exception) + MP_DEFINE_EXCEPTION_BASE(SyntaxError) + MP_DEFINE_EXCEPTION(IndentationError, SyntaxError) + MP_DEFINE_EXCEPTION_BASE(IndentationError) + MP_DEFINE_EXCEPTION(TabError, IndentationError) + MP_DEFINE_EXCEPTION(SystemError, Exception) + MP_DEFINE_EXCEPTION(TypeError, Exception) + MP_DEFINE_EXCEPTION(ValueError, Exception) + //TODO: Implement UnicodeErrors which take arguments + MP_DEFINE_EXCEPTION(Warning, Exception) + MP_DEFINE_EXCEPTION_BASE(Warning) + MP_DEFINE_EXCEPTION(DeprecationWarning, Warning) + MP_DEFINE_EXCEPTION(PendingDeprecationWarning, Warning) + MP_DEFINE_EXCEPTION(RuntimeWarning, Warning) + MP_DEFINE_EXCEPTION(SyntaxWarning, Warning) + MP_DEFINE_EXCEPTION(UserWarning, Warning) + MP_DEFINE_EXCEPTION(FutureWarning, Warning) + MP_DEFINE_EXCEPTION(ImportWarning, Warning) + MP_DEFINE_EXCEPTION(UnicodeWarning, Warning) + MP_DEFINE_EXCEPTION(BytesWarning, Warning) + MP_DEFINE_EXCEPTION(ResourceWarning, Warning) mp_obj_t mp_obj_new_exception(const mp_obj_type_t *exc_type) { return mp_obj_new_exception_msg_varg(exc_type, NULL); diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 0e0479e9bb..96d94d937d 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -34,21 +34,64 @@ Q(Ellipsis) Q(StopIteration) Q(BaseException) +Q(ArithmeticError) Q(AssertionError) Q(AttributeError) +Q(BlockingIOError) +Q(BrokenPipeError) +Q(BufferError) +Q(BytesWarning) +Q(ChildProcessError) +Q(ConnectionAbortedError) +Q(ConnectionError) +Q(ConnectionRefusedError) +Q(ConnectionResetError) +Q(DeprecationWarning) +Q(EOFError) +Q(EnvironmentError) +Q(Exception) +Q(FileExistsError) +Q(FileNotFoundError) +Q(FloatingPointError) +Q(FutureWarning) +Q(GeneratorExit) +Q(IOError) Q(ImportError) +Q(ImportWarning) Q(IndentationError) Q(IndexError) +Q(InterruptedError) +Q(IsADirectoryError) Q(KeyError) +Q(LookupError) +Q(MemoryError) Q(NameError) +Q(NotADirectoryError) Q(NotImplementedError) Q(OSError) +Q(OverflowError) +Q(PendingDeprecationWarning) +Q(PermissionError) +Q(ProcessLookupError) +Q(ReferenceError) +Q(ResourceWarning) +Q(RuntimeError) +Q(RuntimeWarning) Q(SyntaxError) +Q(SyntaxWarning) +Q(SystemError) +Q(SystemExit) +Q(TabError) +Q(TimeoutError) Q(TypeError) +Q(UnboundLocalError) +Q(UnicodeWarning) +Q(UserWarning) Q(ValueError) -Q(OverflowError) +Q(Warning) Q(ZeroDivisionError) + Q(NoneType) Q(abs) diff --git a/py/runtime.c b/py/runtime.c index 68edf54567..1cc1c2e6b2 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -142,23 +142,49 @@ STATIC const mp_builtin_elem_t builtin_table[] = { // built-in exceptions { MP_QSTR_BaseException, (mp_obj_t)&mp_type_BaseException }, + { MP_QSTR_ArithmeticError, (mp_obj_t)&mp_type_ArithmeticError }, { MP_QSTR_AssertionError, (mp_obj_t)&mp_type_AssertionError }, { MP_QSTR_AttributeError, (mp_obj_t)&mp_type_AttributeError }, + { MP_QSTR_BufferError, (mp_obj_t)&mp_type_BufferError }, + { MP_QSTR_BytesWarning, (mp_obj_t)&mp_type_BytesWarning }, + { MP_QSTR_DeprecationWarning, (mp_obj_t)&mp_type_DeprecationWarning }, + { MP_QSTR_EOFError, (mp_obj_t)&mp_type_EOFError }, + { MP_QSTR_EnvironmentError, (mp_obj_t)&mp_type_EnvironmentError }, + { MP_QSTR_Exception, (mp_obj_t)&mp_type_Exception }, + { MP_QSTR_FloatingPointError, (mp_obj_t)&mp_type_FloatingPointError }, + { MP_QSTR_FutureWarning, (mp_obj_t)&mp_type_FutureWarning }, + { MP_QSTR_GeneratorExit, (mp_obj_t)&mp_type_GeneratorExit }, + { MP_QSTR_IOError, (mp_obj_t)&mp_type_IOError }, { MP_QSTR_ImportError, (mp_obj_t)&mp_type_ImportError }, + { MP_QSTR_ImportWarning, (mp_obj_t)&mp_type_ImportWarning }, { MP_QSTR_IndentationError, (mp_obj_t)&mp_type_IndentationError }, { MP_QSTR_IndexError, (mp_obj_t)&mp_type_IndexError }, { MP_QSTR_KeyError, (mp_obj_t)&mp_type_KeyError }, + { MP_QSTR_LookupError, (mp_obj_t)&mp_type_LookupError }, + { MP_QSTR_MemoryError, (mp_obj_t)&mp_type_MemoryError }, { MP_QSTR_NameError, (mp_obj_t)&mp_type_NameError }, + { MP_QSTR_NotImplementedError, (mp_obj_t)&mp_type_NotImplementedError }, + { MP_QSTR_OSError, (mp_obj_t)&mp_type_OSError }, + { MP_QSTR_OverflowError, (mp_obj_t)&mp_type_OverflowError }, + { MP_QSTR_PendingDeprecationWarning, (mp_obj_t)&mp_type_PendingDeprecationWarning }, + { MP_QSTR_ReferenceError, (mp_obj_t)&mp_type_ReferenceError }, + { MP_QSTR_ResourceWarning, (mp_obj_t)&mp_type_ResourceWarning }, + { MP_QSTR_RuntimeError, (mp_obj_t)&mp_type_RuntimeError }, + { MP_QSTR_RuntimeWarning, (mp_obj_t)&mp_type_RuntimeWarning }, { MP_QSTR_SyntaxError, (mp_obj_t)&mp_type_SyntaxError }, + { MP_QSTR_SyntaxWarning, (mp_obj_t)&mp_type_SyntaxWarning }, + { MP_QSTR_SystemError, (mp_obj_t)&mp_type_SystemError }, + { MP_QSTR_SystemExit, (mp_obj_t)&mp_type_SystemExit }, + { MP_QSTR_TabError, (mp_obj_t)&mp_type_TabError }, { MP_QSTR_TypeError, (mp_obj_t)&mp_type_TypeError }, + { MP_QSTR_UnboundLocalError, (mp_obj_t)&mp_type_UnboundLocalError }, + { MP_QSTR_UserWarning, (mp_obj_t)&mp_type_UserWarning }, { MP_QSTR_ValueError, (mp_obj_t)&mp_type_ValueError }, + { MP_QSTR_Warning, (mp_obj_t)&mp_type_Warning }, + { MP_QSTR_ZeroDivisionError, (mp_obj_t)&mp_type_ZeroDivisionError }, + { MP_QSTR_StopIteration, (mp_obj_t)&mp_type_StopIteration }, // Somehow CPython managed to have OverflowError not inherit from ValueError ;-/ // TODO: For MICROPY_CPYTHON_COMPAT==0 use ValueError to avoid exc proliferation - { MP_QSTR_OverflowError, (mp_obj_t)&mp_type_OverflowError }, - { MP_QSTR_OSError, (mp_obj_t)&mp_type_OSError }, - { MP_QSTR_NotImplementedError, (mp_obj_t)&mp_type_NotImplementedError }, - { MP_QSTR_StopIteration, (mp_obj_t)&mp_type_StopIteration }, - { MP_QSTR_ZeroDivisionError, (mp_obj_t)&mp_type_ZeroDivisionError }, // Extra builtins as defined by a port MICROPY_EXTRA_BUILTINS |