From fa81491764861e63785a3faa241c488469087209 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Thu, 21 Sep 2017 17:45:39 +1000 Subject: Move the reraise logic into the tool kit. --- rtemstoolkit/__init__.py | 2 + rtemstoolkit/reraise.py | 107 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 rtemstoolkit/reraise.py diff --git a/rtemstoolkit/__init__.py b/rtemstoolkit/__init__.py index f3fbbcd..ca2d619 100644 --- a/rtemstoolkit/__init__.py +++ b/rtemstoolkit/__init__.py @@ -38,6 +38,7 @@ all = ['check', 'mailer', 'options', 'path', + 'reraise', 'version'] from . import check @@ -50,4 +51,5 @@ from . import macros from . import mailer from . import options from . import path +from . import reraise from . import version diff --git a/rtemstoolkit/reraise.py b/rtemstoolkit/reraise.py new file mode 100644 index 0000000..4b80861 --- /dev/null +++ b/rtemstoolkit/reraise.py @@ -0,0 +1,107 @@ +# +# RTEMS Tools Project (http://www.rtems.org/) +# Copyright 2013-2017 Chris Johns (chrisj@rtems.org) +# All rights reserved. +# +# This file is part of the RTEMS Tools package in 'rtems-tools'. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from __future__ import print_function + +import sys + +# +# The following fragment is taken from https://bitbucket.org/gutworth/six +# to raise an exception. The python2 code cause a syntax error with python3. +# +# Copyright (c) 2010-2016 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +# Taken from six. +# +if sys.version_info[0] == 3: + def reraise(tp, value, tb = None): + raise value.with_traceback(tb) +else: + def exec_(_code_, _globs_ = None, _locs_ = None): + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb = None): + raise tp, value, tb +""") + +if __name__ == "__main__": + try: + import threading + import time + result = None + finished = False + def _thread(): + global finished + global result + try: + raise ValueError('raised inside a thread, reaise is working') + except: + result = sys.exc_info() + finished = True + thread = threading.Thread(target = _thread, name = 'test') + thread.start() + while not finished: + time.sleep(0.05) + if result is not None: + reraise(*result) + else: + print('error: no exception raised and caught') + except ValueError as ve: + print('exception caught: %s' % (str(ve))) + except KeyboardInterrupt: + print('abort: user terminated') + except: + print('unknown exception caught') -- cgit v1.2.3