以下示例只是一个黑客,因为我不太了解它:
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))
我怎样才能更好地做到这一点?我之前的解决方案是收集列表中的错误描述并将其传递给错误实例。因此,毕竟这与此处所示的解决方案类似。
答案 0 :(得分:0)
类似的东西。
#!/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