The response just can be a string or a Exception instance now, an error means a special response, it is easy to distinguish them, ex:

    def callback(conn, response):
        if isinstance(response, NSQError):
            logging.error("blablabla")


or there will be some confused None response like below:

    callback(conn, response, error) #  _data_callback
    callback(conn, None, error) # _pub
    callback(conn, None, ConnectionClosedError()) # _close_callback