我试图用装饰器捕捉线程错误:
class cc:
def catch_exceptions(job_func):
@functools.wraps(job_func)
def wrapper(*args, **kwargs):
try:
job_func(*args, **kwargs)
except:
import traceback
print(traceback.format_exc())
return wrapper
@catch_exceptions
def job(self, name, command):
#print("I'm running on thread %s" % threading.current_thread())
os.system(command)
def run_threaded(self, job_func, name, command):
job_thread = threading.Thread(target=job_func, args=(name, command,) )
job_thread.start()
我遇到了这个问题:
File "/usr/local/lib/python2.7/dist-packages/schedule/__init__.py", line 320, in do
self.job_func = functools.partial(job_func, *args, **kwargs)
TypeError: the first argument must be callable
如何让job_func
可以调用?
答案 0 :(得分:4)
你的装饰师弄错了;取消return wrapper
行。
目前,您的装饰师会返回None
,因此cc.job
设置为None
。
更正后的版本为:
def catch_exceptions(job_func):
@functools.wraps(job_func)
def wrapper(*args, **kwargs):
try:
job_func(*args, **kwargs)
except:
import traceback
print(traceback.format_exc())
return wrapper
您可能希望避免在那里使用完全裸except
;你现在也在捕捉键盘中断和系统退出异常。在一个并不重要的线程中(例外情况,如果没有被捕获,不管怎样都不会传播到主线程),但是通常你想在{0}处使用except Exception:
至少。