فهرست منبع

catch all Exceptions, transmit traceback back from remote

before this changesets, most informations about exceptions/tracebacks
on the remote side were lost. now they are transmitted and displayed,
together with the remote attic version.
Thomas Waldmann 10 سال پیش
والد
کامیت
c679f1a6f0
2فایلهای تغییر یافته به همراه11 افزوده شده و 4 حذف شده
  1. 3 0
      attic/archiver.py
  2. 8 4
      attic/remote.py

+ 3 - 0
attic/archiver.py

@@ -728,6 +728,9 @@ def main():
     except Error as e:
         archiver.print_error(e.get_message())
         exit_code = e.exit_code
+    except RemoteRepository.RPCError as e:
+        print(e)
+        exit_code = 1
     except KeyboardInterrupt:
         archiver.print_error('Error: Keyboard interrupt')
         exit_code = 1

+ 8 - 4
attic/remote.py

@@ -7,6 +7,9 @@ import shutil
 from subprocess import Popen, PIPE
 import sys
 import tempfile
+import traceback
+
+from attic import __version__
 
 from .hashindex import NSIndex
 from .helpers import Error, IntegrityError
@@ -52,8 +55,9 @@ class RepositoryServer(object):
                         except AttributeError:
                             f = getattr(self.repository, method)
                         res = f(*args)
-                    except Exception as e:
-                        sys.stdout.buffer.write(msgpack.packb((1, msgid, e.__class__.__name__, e.args)))
+                    except BaseException as e:
+                        exc = "Remote Traceback by Attic %s%s%s" % (__version__, os.linesep, traceback.format_exc())
+                        sys.stdout.buffer.write(msgpack.packb((1, msgid, e.__class__.__name__, exc)))
                     else:
                         sys.stdout.buffer.write(msgpack.packb((1, msgid, None, res)))
                     sys.stdout.flush()
@@ -157,7 +161,7 @@ class RemoteRepository(object):
                             raise PathNotAllowed(*res)
                         if error == b'ObjectNotFound':
                             raise Repository.ObjectNotFound(res[0], self.location.orig)
-                        raise self.RPCError(error)
+                        raise self.RPCError(res.decode('utf-8'))
                     else:
                         yield res
                         if not waiting_for and not calls:
@@ -312,4 +316,4 @@ class RepositoryCache:
 def cache_if_remote(repository):
     if isinstance(repository, RemoteRepository):
         return RepositoryCache(repository)
-    return repository
+    return repository