2

我正面临与此类似的异常,我正在尝试根据错误本身来处理它。问题是它pyhive.exc.OperationalError非常通用,并且可以处理从超时到不存在的表的错误,因此我需要该errorMessage部分的确切值才能以不同的方式处理每种错误类型,例如超时,等待并重试;如果是别的东西,以不同的方式处理,依此类推。

如果我将错误捕获为except OperationalError as e,我将如何提取该errorMessage部分?我可以解析字符串表示 ( e.__str__()) 但这似乎很奇怪,因为我确信有正确的方法。

4

3 回答 3

1

如果你看到实现hive 异常实现,它只是继承了Exception所以它只有字符串格式的异常细节,看起来有点json让我们感到困惑,我们希望使用实例变量或字典来访问它,但实际上它是只是看起来像的字符串json

但是我们可以使用正则表达式来提取我们希望的细节等errortype

于 2019-06-12T13:46:19.903 回答
1

我找到了另一种方法,这似乎是一种更好的方法。

 try:
        return presto.execute_query_safe(query, bind_params)
 except pyhive.exc.DatabaseError as e:
        logging.error("Query failed", exc_info=1)
        if error.args[0]['errorName'] == 'SYNTAX_ERROR' or error.args[0]['errorType'] == 'USER_ERROR':
            raise NonRecoverableQueryError('Non Recoverable Error: ' + str(error))
        raise e
于 2019-06-17T11:19:37.517 回答
0

您可以通过这种方式提取errorMessage

from pyhive import hive, exc

try:
  connection = hive.connect(host="localhost", port=10000)
  cursor = connection.cursor()
  cursor.execute(sql_string)
except exc.Error as e:
  error_message = e.args[0].status.errorMessage
  print(error_message)

您可以使用dir(e)查找每个对象的方法和 dunder 方法。这将允许您查看可以调用哪些方法来访问数据。

于 2021-10-21T21:39:41.327 回答