如何收集几个错误来总结这些错误?

2024-10-03 21:30:38 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的例子只是一个黑客,因为我不太了解它:

class ErrorCollector(Exception):
    def __init__(self):
        self.errors = []

    def __nonzero__(self):
        return bool(self.errors)

def do_something(a, b):
    err = ErrorCollector()
    try:
        int(a)
    except Exception:
        err.errors.append('{!r} fails'.format(a))
    try:
        int(b)
    except Exception:
        err.errors.append('{!r} fails'.format(b))
    if err:
        raise err

def run(*args):
    err = ErrorCollector()
    for arg in args:
        try:
            do_something(*arg)
        except Exception as e:
            err.errors.extend(e.errors)
    if err:
        print 'You have these problems:\n{}'.format('\n'.join(err.errors))

我怎样才能做得更好?我以前的一个解决方案是收集列表中的错误描述并将其传递给错误实例。因此,毕竟,这与这里显示的解决方案类似。你知道吗


Tags: selfformatifdefexceptiondosomethingint
1条回答
网友
1楼 · 发布于 2024-10-03 21:30:38

差不多吧。你知道吗

#!/usr/bin/env python
import functools
import inspect
import sys
import traceback


class ErrorCollector(Exception):
    def __init__(self):
        self.errors = []

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.append(exc_type, exc_val, exc_tb)
        if self.errors:
            raise self

    def append(self, exc_type=None, exc_val=None, exc_tb=None):
        if exc_type is None and exc_val is None and exc_tb is None:
            exc_type, exc_val, exc_tb = sys.exc_info()
        if exc_type is not None and exc_val is not None and exc_tb is not None:
            self.errors.append('\n'.join(traceback.format_exception(exc_type, exc_val, exc_tb)))

    def __str__(self):
        return '\n'.join(self.errors)

    __unicode__ = __str__


def error_collector(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        with ErrorCollector() as err_collector:
            names, _, _, _ = inspect.getargspec(func)
            if 'err_collector' in names:
                kwargs['err_collector'] = err_collector
            return func(*args, **kwargs)
    return wrapper


def test1():
    with ErrorCollector():
        print 'no errors'

    with ErrorCollector() as err_collector:
        try:
            raise Exception('1')
        except:
            err_collector.append()
        raise Exception('2')


@error_collector
def test2():
    raise Exception('3')


@error_collector
def test3(err_collector):
    try:
        raise Exception('4')
    except:
        err_collector.append()
    raise Exception('5')


if __name__ == '__main__':
    try:
        test1()
    except Exception as e:
        print e

    try:
        test2()
    except Exception as e:
        print e

    try:
        test3()
    except Exception as e:
        print e

相关问题 更多 >