Exception handing and custom error types
Exception handing and custom error types
Apache MXNet v1.7 has added the custom error type support and as a result MXNetError
is inherited from RuntimeError
so it is possible to register a custom error type in the backend and prepend its error message. Then in the frontend, one can throw the exception of the registered error type.
For example, we want the transpose
operator defined in the C++ backend to throw ValueError
type in the Python frontend. Therefore, in the C++ backend we can add this check:
CHECK_EQ(axes_set.size(), axes.ndim()) << "ValueError: Repeated axis in transpose."
<< " param.axes = "
<< param.axes;
so that on the frontend, when a problematic transpose
call is made such as:
from mxnet import np
dat = np.random.normal(0, 1, (3, 4, 5))
dat.transpose((0, 0, 1))
the following traceback will be produced:
ValueError Traceback (most recent call last)
<ipython-input-3-3ad259b4e371> in <module>
----> 1 dat.transpose((0, 0, 1))
~/mxnet-distro/mxnet-build/python/mxnet/numpy/multiarray.py in transpose(self, *axes)
1460 elif axes[0] is None:
1461 axes = None
-> 1462 return _mx_np_op.transpose(self, axes=axes)
1463
1464 def flip(self, *args, **kwargs):
~/mxnet-distro/mxnet-build/python/mxnet/ndarray/register.py in transpose(a, axes, out, name, **kwargs)
~/mxnet-distro/mxnet-build/python/mxnet/_ctypes/ndarray.py in _imperative_invoke(handle, ndargs, keys, vals, out, is_np_op, output_is_list)
105 c_str_array(keys),
106 c_str_array([str(s) for s in vals]),
--> 107 ctypes.byref(out_stypes)))
108
109 create_ndarray_fn = _np_ndarray_cls if is_np_op else _ndarray_cls
~/mxnet-distro/mxnet-build/python/mxnet/base.py in check_call(ret)
271 """
272 if ret != 0:
--> 273 raise get_last_ffi_error()
274
275
ValueError: Traceback (most recent call last):
File "src/operator/numpy/np_matrix_op.cc", line 77
ValueError: Check failed: axes_set.size() == axes.ndim() (2 vs. 3) : Repeated axis in transpose. param.axes = [0,0,1]
Note that as of writing this document, the following Python error types are supported:
ValueError
TypeError
AttributeError
IndexError
NotImplementedError
Check this resource for more details about Python supported error types that MXNet supports.
How to register a custom error type
Here is the way to register a custom error type in Python frontend:
import mxnet as mx
@mx.error.register
class MyError(mx.MXNetError):
def __init__(self, msg):
super().__init__(msg)
Then in the C++ backend, you can refer to MyError
via:
LOG(FATAL) << "MyError: this is a custom error message"