如何在 python 中组合多个 except 语句

How to combine multiple except statements in python

我捕获了 3 个不同的异常,错误在所有异常中的处理方式都不同,如下所示。

                except IntegrityError as e:
                    error_objects.append(
                        {
                            "Row Number": index + 1,
                            "Error": parse_integrity_error(e),
                            "data": user_given_data,
                        }
                    )
                except ValidationError as e:
                    error_objects.append(
                        {
                            "Row Number": index + 1,
                            "Error": e.detail[0],
                            "data": user_given_data,
                        }
                    )
                except Exception as e:
                    error_objects.append(
                        {
                            "Row Number": index + 1,
                            "Error": str(e),
                            "data": user_given_data,
                        }
                    )

有clean/neat/pythonic方法吗?

由于所有异常处理程序都做同样的事情,只是它们将异常对象转换为字符串的方式有所不同,因此您可以向每个自定义异常添加一个 __str__ 方法 类 (IntegrityErrorValidationError 在您的示例中)以便它们的实例可以通过对 str 函数的调用一致地格式化,就像您将常规 Exception 对象转换为字符串:

class IntegrityError(Exception):
    def __str__(self):
        return parse_integrity_error(self)

class ValidationError(Exception):
    def __str__(self):
        return self.detail[0]

try:
    ...
except Exception as e:
    error_objects.append(
        {
            "Row Number": index + 1,
            "Error": str(e),
            "data": user_given_data,
        }
    )

我会像这样在一个函数(甚至是函数外的字典)中注册异常(这是一个例子):

def exception_return_value(e):
    type_e = type(e)

    if type_e == IndexError:
        error = 'IndexError Value'
    elif type_e == ValueError:
        error = 'ValueError Value'
    else:
        error = 'Exception Error'

    return {"Row Number": 10, "Error": error, "data": 20}


try:
    raise ValueError()

except (IndexError, ValueError, Exception) as e:
    return_value = exception_return_value(e)
    print(return_value)

因为我没有你的代码,所以我无法 运行,但你可以像这样重写它:

def exception_return_value(e):
    type_e = type(e)

    if type_e == IntegrityError:
        error = parse_integrity_error(e)
    elif type_e == ValidationError:
        error = e.detail[0]
    else:
        error = str(e)

    return {"Row Number": index + 1, "Error": error, "data": user_given_data}


try:
    ...
except (IntegrityError, ValidationError, Exception) as e:
    return_value = exception_return_value(e)
    error_objects.append(return_value)