增加异常的定义和处理
diff --git a/dubbo_client/__init__.py b/dubbo_client/__init__.py
index 8bf05e7..7feb134 100644
--- a/dubbo_client/__init__.py
+++ b/dubbo_client/__init__.py
@@ -3,3 +3,4 @@
 from rpc import (
     DubboClient,
 )
+from rpcerror import *
\ No newline at end of file
diff --git a/dubbo_client/registry.py b/dubbo_client/registry.py
index fe15119..025782a 100644
--- a/dubbo_client/registry.py
+++ b/dubbo_client/registry.py
@@ -38,7 +38,7 @@
 
 
 def node_listener(event):
-    print event
+    # print event
     event_queue.put(event)
 
 
@@ -91,7 +91,7 @@
 
 for i in range(num_worker_threads):
     t = Thread(target=worker)
-    t.daemon = False
+    t.daemon = True
     t.start()
 
 
diff --git a/dubbo_client/rpc.py b/dubbo_client/rpc.py
index 0ac0b81..6bbd3ba 100644
--- a/dubbo_client/rpc.py
+++ b/dubbo_client/rpc.py
@@ -1,9 +1,11 @@
 import httplib
 import json
 import random
-from pyjsonrpc import HttpClient
+from urllib2 import HTTPError
+from pyjsonrpc import HttpClient, JsonRpcError
 
 from dubbo_client.registry import service_provides, add_provider_listener
+from dubbo_client.rpcerror import NoProvider, ConnectionFail, dubbo_client_errors
 
 
 __author__ = 'caozupeng'
@@ -42,11 +44,16 @@
     def call(self, method, *args, **kwargs):
         provides = service_provides.get(self.interface, {})
         if len(provides) == 0:
-            return None
+            raise NoProvider('can not find provide', self.interface)
         location, provide = random.choice(provides.items())
         print 'location is {0}'.format(location)
         client = HttpClient(url="http://{0}{1}".format(location, provide.path))
-        return client.call(method, *args, **kwargs)
+        try:
+            return client.call(method, *args, **kwargs)
+        except HTTPError, e:
+            raise ConnectionFail(None, e.filename)
+        except JsonRpcError, error:
+            raise dubbo_client_errors.get(error.code, None)
 
     def __call__(self, method, *args, **kwargs):
         """
diff --git a/dubbo_client/rpcerror.py b/dubbo_client/rpcerror.py
new file mode 100644
index 0000000..fae2805
--- /dev/null
+++ b/dubbo_client/rpcerror.py
@@ -0,0 +1,88 @@
+# coding=utf-8
+__author__ = 'caozupeng'
+
+dubbo_client_errors = {}
+
+
+class DubboClientError(RuntimeError):
+    code = None
+    message = None
+    data = None
+
+    def __init__(self, message=None, data=None, code=None):
+        RuntimeError.__init__(self)
+        self.message = message or self.message
+        self.data = data
+        self.code = code or self.code
+        assert self.code, "Error without code is not allowed."
+
+    def __str__(self):
+        return "DubboError({code}): {message}".format(
+            code=self.code,
+            message=str(self.message)
+        )
+
+    def __unicode__(self):
+        return u"DubboClientError({code}): {message}".format(
+            code=self.code,
+            message=self.message
+        )
+
+
+class MethodNotFound(DubboClientError):
+    code = -32601
+    message = u"The method does not exist / is not available."
+
+    def __init__(self, message=None, data=None):
+        DubboClientError.__init__(self, message=message, data=data)
+
+
+class ConnectionFail(DubboClientError):
+    code = 504
+    message = u'connect failed {0}'
+
+    def __init__(self, message=None, data=None):
+        message = self.message.format(data)
+        DubboClientError.__init__(self, message=message, data=data)
+
+
+class NoProvider(DubboClientError):
+    code = 5050
+    message = u'No provide name {0}'
+    provide_name = u''
+
+    def __init__(self, message=None, data=None):
+        self.provide_name = data
+        DubboClientError.__init__(self, message=self.message.format(data), data=data)
+
+
+class InvalidParams(DubboClientError):
+    code = -32602
+    message = u"Invalid method parameter(s)."
+
+    def __init__(self, message=None, data=None):
+        DubboClientError.__init__(self, message=message, data=data)
+
+
+class InternalError(DubboClientError):
+    code = -32603
+    message = u"Internal JSON-RPC error."
+
+    def __init__(self, message=None, data=None):
+        DubboClientError.__init__(self, message=message, data=data)
+
+
+class InvalidRequest(DubboClientError):
+    code = -32600
+    message = u"The JSON sent is not a valid Request object."
+
+    def __init__(self, message=None, data=None):
+        DubboClientError.__init__(self, message=message, data=data)
+
+
+dubbo_client_errors[MethodNotFound.code] = MethodNotFound
+dubbo_client_errors[NoProvider.code] = NoProvider
+dubbo_client_errors[ConnectionFail.code] = ConnectionFail
+dubbo_client_errors[InvalidParams.code] = InvalidParams
+dubbo_client_errors[InternalError.code] = InternalError
+dubbo_client_errors[InvalidRequest.code] = InvalidRequest
diff --git a/test_dubbo_client/test_rpclib.py b/test_dubbo_client/test_rpclib.py
index 6bf7e04..2346359 100644
--- a/test_dubbo_client/test_rpclib.py
+++ b/test_dubbo_client/test_rpclib.py
@@ -1,7 +1,7 @@
 # coding=utf-8
 import time
 
-from dubbo_client import DubboClient
+from dubbo_client import DubboClient, DubboClientError
 
 
 __author__ = 'caozupeng'
@@ -10,10 +10,14 @@
     service_interface = 'com.ofpay.demo.api.UserProvider'
     dubbo_client = DubboClient(service_interface)
     for i in range(1000):
-        print dubbo_client.getUser('A003')
-        print dubbo_client.queryUser(
-            {u'age': 18, u'time': 1428463514153, u'sex': u'MAN', u'id': u'A003', u'name': u'zhangsan'})
-        print dubbo_client.queryAll()
-        print dubbo_client.isLimit('MAN', 'Joe')
-        print dubbo_client('getUser', 'A005')
+        try:
+            print dubbo_client.getUser('A003')
+            print dubbo_client.queryUser(
+                {u'age': 18, u'time': 1428463514153, u'sex': u'MAN', u'id': u'A003', u'name': u'zhangsan'})
+            print dubbo_client.queryAll()
+            print dubbo_client.isLimit('MAN', 'Joe')
+            print dubbo_client('getUser', 'A005')
+
+        except DubboClientError, client_e:
+            print client_e
         time.sleep(5)