<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def join(self, timeout=None):
 """Overwrites `threading.Thread.join`, to allow handling of exceptions thrown by threads from within the main app."""

        Thread.join(self, timeout=timeout)
        if self.exc:
            msg = "Thread '%s' threw an exception `%s`: %s" \
                  % (self.getName(), self.exc[0].__name__, self.exc[1])
            new_exc = LaneExecutionError(msg)

            if PY3:
                raise new_exc.with_traceback(self.exc[2])  # pylint: disable=no-member
            else:
                raise (new_exc.__class__, new_exc, self.exc[2])