Python:如何将控制台中的错误写入txt文件?

Python:如何将控制台中的错误写入txt文件?,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我有一个python脚本,每10分钟向我发送一封电子邮件,其中包含控制台中编写的所有内容。我在我的Ubuntu18.04 vps中用crontab运行这个。 有时它不发送邮件,因此我假设当发生错误时,执行会停止,但我如何才能将错误写入txt文件中,以便分析错误?您可以使用注释中建议的日志记录模块(可能更高级,但超出我的知识范围),或者使用try和捕捉错误,但除外,如: try: pass #run the code you currently have except Except

我有一个python脚本,每10分钟向我发送一封电子邮件,其中包含控制台中编写的所有内容。我在我的Ubuntu18.04 vps中用crontab运行这个。
有时它不发送邮件,因此我假设当发生错误时,执行会停止,但我如何才能将错误写入txt文件中,以便分析错误?

您可以使用注释中建议的
日志记录
模块(可能更高级,但超出我的知识范围),或者使用
try
捕捉错误,但
除外,如:

try:
    pass
    #run the code you currently have
except Exception as e: # catch ALLLLLL errors!!!
    print(e) # or more likely you'd want something like "email_to_me(e)"
虽然一般不赞成捕捉所有的例外情况,因为如果您的程序因任何原因失败,它将被
except
子句吞没,因此更好的方法是找出您遇到的具体错误,如
indexer
,然后捕获此具体错误,如:

try:
    pass
    #run the code you currently have
except IndexError as e: # catch only indexing errors!!!
    print(e) # or more likely you'd want something like "email_to_me(e)"
记录模块 为了演示模块的方法,这将是一般方法

导入日志
#创建一个日志实例
logger=logging.getLogger('我的应用程序')
logger.setLevel(logging.INFO)#您可以将其设置为DEBUG、INFO、ERROR
#将文件处理程序分配给该实例
fh=logging.FileHandler(“file_dir.txt”)
fh.setLevel(logging.INFO)#同样,您可以进行不同的设置
#格式化日志(可选)
格式化程序=日志记录。格式化程序('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
fh.setFormatter(格式化程序)#这将设置文件处理程序的格式
#将处理程序添加到日志实例
logger.addHandler(fh)
尝试:
raise VALUERROR(“发生了一些错误”)
除ValueError为e外:
logger.exception(e)#将错误发送到文件
如果我
cat文件\u dir.txt

2019-03-14 14:52:50,676 - my_application - ERROR - Some error occurred
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: Some error occurred
Some error occurred
cat my_errors.txt

2019-03-14 14:52:50,676 - my_application - ERROR - Some error occurred
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: Some error occurred
Some error occurred
请注意,
logging.exception
在本例中包括回溯,这是该模块的许多巨大好处之一

编辑 为了完整性起见,该模块采用了与打印类似的方法,其中您可以提供文件句柄:

导入回溯
导入系统
以open('error.txt','a')作为fh:
尝试:
raise VALUERROR(“发生了一些错误”)
除ValueError为e外:
e_type,e_val,e_tb=sys.exc_info()
traceback.print_异常(e_类型、e_值、e_tb、file=fh)

这将包括您想要从
日志记录

使用日志记录包写入日志文件的所有信息。您使用的是什么代码?难道你不能把它包装成一个
试试
并将异常保存在
catch
中吗?
日志记录是最好的方法。如果您感到非常邪恶,您可以使用
文件
将文件句柄对象传递给
打印
,非常感谢!目前,日志记录对我来说很难,我将在不久的将来进行研究future@strangethingspy没问题!如果这解决了您的问题,通常的做法是单击我的帖子旁边的复选标记,将其作为您正在寻找的答案!当你获得15个代表时,你还可以投票选出有用的答案(和问题):)