2017-05-18 30 views
1
if语句

简而言之登录手动引发的异常,我有一段代码,看起来像这样:你如何在python

if some_condition_that_evals_to_True: 
    raise ValueError("Error message") 

我想要做的是插入记录语句日志这整个例外,但这样做只是这样不仅节省了记录消息:

if some_condition_that_evals_to_True: 
    logger.error("Logged error message") 
    raise ValueError("Error message") 

任何一个知道如何保存包括ValueError异常整个错误消息?

编辑:

下面是什么,我试图重新:

if some_condition_that_evals_to_True: 
    try: 
     raise ValueError("Error with value") 
    except ValueError: 
     logger.exception("Logging Error with Value") 
     raise 

但是,这似乎是一种迂回的方式来获得我想要的行为,所以另一种方式来短语我的问题:有一种更优雅的方式获得与上述代码块相同的行为?

+2

什么* *实际发生时,你试过吗?显示实际的输出,以及它与你想要的不同。简而言之,不要问*我们*它是否会工作,请问最终权威人士:您的Python运行时系统。 :-) – Prune

+0

@Prune试了一下,并得到了预期的结果,我编辑说明,以反映 – K4n3

+1

伟大的。尝试'ValueError'的异常处理程序并记录你喜欢的内容。这对你有用吗? – Prune

回答

1

使用logging module时尝试stack_info关键字参数:

import logging 
logging.basicConfig(filename='example.log',level=logging.DEBUG) 
if True: 
    logging.error('Error Message', stack_info=True) 
    raise ValueError('Custom Error Message') 

运行这说明如下:

J:\>python log_stack.py 
Traceback (most recent call last): 
    File "log_stack.py", line 5, in <module> 
    raise ValueError('Custom Error Message') 
ValueError: Custom Error Message 

J:\>more example.log 
ERROR:root:Error Message 
Stack (most recent call last): 
    File "log_stack.py", line 4, in <module> 
    logging.error('Error Message', stack_info=True) 
+0

这几乎就是我所希望的。有没有一种方法记录ValueError是导致错误的原因?本质上只是记录打印的内容 – K4n3

+2

@Abdullah'ValueError'不会导致错误,'ValueError'仅仅是通知其他代码特定错误类型的机制。您的日志消息应该为人类提供信息,因此像“'foo'%foo'的无效值%r之类的日志消息应该能够为您提供所需的所有信息。 – deceze

+0

@Abdullah你可以实例化一个例外,例如'e = ValueError('custom')',然后使用'logging.exception(e,stack_info = True)'记录日志,但是文档说只能从异常处理程序调用(我不知道具体原因),这就是为什么我没有在上面使用它。它在我们微不足道的例子中起作用。 – Eric