簡體   English   中英

如何收集幾個錯誤以總結這些錯誤?

[英]How to collect several errors to raise a summary of these?

以下示例僅是一個hack原因,我不了解它:

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))

我該如何做得更好? 我的一個較早的解決方案是收集列表中的錯誤描述,並將其傳遞給錯誤實例。 因此,畢竟,這類似於此處顯示的解決方案。

這樣的事情。

#!/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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM