Throw more informative error classes from perf.
[pdm.git] / pdm / srv.py
index abf7d89..2ddb9e7 100644 (file)
@@ -10,6 +10,7 @@ which describes the functioning of the REPL and PERF protocols.
 import os, sys, socket, threading, grp, select
 import types, pprint, traceback
 import pickle, struct
 import os, sys, socket, threading, grp, select
 import types, pprint, traceback
 import pickle, struct
+from . import perf as mperf
 
 __all__ = ["repl", "perf", "listener", "unixlistener", "tcplistener", "listen"]
 
 
 __all__ = ["repl", "perf", "listener", "unixlistener", "tcplistener", "listen"]
 
@@ -62,8 +63,10 @@ class repl(object):
                 self.echo(eval(ccode, self.mod.__dict__))
                 self.cl.send(b"+OK\n")
         except:
                 self.echo(eval(ccode, self.mod.__dict__))
                 self.cl.send(b"+OK\n")
         except:
-            for line in traceback.format_exception(*sys.exc_info()):
-                self.cl.send(b" " + line.encode("utf-8"))
+            lines = ("".join(traceback.format_exception(*sys.exc_info()))).split("\n")
+            while len(lines) > 0 and lines[-1] == "": lines = lines[:-1]
+            for line in lines:
+                self.cl.send(b" " + line.encode("utf-8") + b"\n")
             self.cl.send(b"+EXC\n")
 
     def handle(self, buf):
             self.cl.send(b"+EXC\n")
 
     def handle(self, buf):
@@ -195,7 +198,7 @@ class perf(object):
 
     def bindob(self, id, ob):
         if not hasattr(ob, "pdm_protocols"):
 
     def bindob(self, id, ob):
         if not hasattr(ob, "pdm_protocols"):
-            raise ValueError("Object does not support PDM introspection")
+            raise mperf.nosuchname("Object does not support PDM introspection")
         try:
             proto = ob.pdm_protocols()
         except Exception as exc:
         try:
             proto = ob.pdm_protocols()
         except Exception as exc:
@@ -206,12 +209,12 @@ class perf(object):
     def bind(self, id, module, obnm):
         resmod = sys.modules.get(module)
         if resmod is None:
     def bind(self, id, module, obnm):
         resmod = sys.modules.get(module)
         if resmod is None:
-            self.send("-", ImportError("No such module: %s" % module))
+            self.send("-", mperf.nosuchname("No such module: %s" % module))
             return
         try:
             ob = getattr(resmod, obnm)
         except AttributeError:
             return
         try:
             ob = getattr(resmod, obnm)
         except AttributeError:
-            self.send("-", AttributeError("No such object: %s" % obnm))
+            self.send("-", mperf.nosuchname("No such object: %s" % obnm))
             return
         try:
             proto = self.bindob(id, ob)
             return
         try:
             proto = self.bindob(id, ob)
@@ -227,7 +230,7 @@ class perf(object):
             return None
         ob, protos = ob
         if proto not in protos:
             return None
         ob, protos = ob
         if proto not in protos:
-            self.send("-", ValueError("Object does not support that protocol"))
+            self.send("-", mperf.nosuchproto("Object does not support that protocol: " + proto))
             return None
         return ob
 
             return None
         return ob
 
@@ -238,7 +241,7 @@ class perf(object):
         try:
             ob = src.lookup(obnm)
         except KeyError as exc:
         try:
             ob = src.lookup(obnm)
         except KeyError as exc:
-            self.send("-", exc)
+            self.send("-", mperf.nosuchname(obnm))
             return
         try:
             proto = self.bindob(tgtid, ob)
             return
         try:
             proto = self.bindob(tgtid, ob)