2017-08-20 27 views
0

我正在運行一個腳本,在cron作業上失敗了很多。它有編碼問題(UTF等),我試圖排序和讓我的頭。我已經完成了這個腳本,當腳本出現時,腳本會將它的錯誤寫入csv,但它沒有問題,但它不會告訴我錯誤發生在哪條線上,所以我正在努力找出在哪裏把一些.encode('utf-8')來解決問題。任何人都可以告訴我,如果有一種方法可以添加到我的錯誤寫入函數來獲取錯誤的行嗎?如何在Python中寫出錯誤異常(以及實際錯誤)的行

我使用捕捉的錯誤(其它代碼的位太)的功能如下...

def error_output(error): 
    t = datetime.now().strftime('%Y-%m-%d %H:%M:%S') 
    new_data = [t, error] 
    f = open('outputs/errors.csv', 'a') 
    csv.writer(f, lineterminator='\n').writerows([new_data]) 
    f.close() 

...和腳本使用這樣說:

if some condition: 
    try: 
     something 
    except Exception as e: 
     error_output(e) 

。 ..this工作得很好,給我一個CSV,告訴我的東西,如:

2017-08-19 23:58:47 'ascii' codec can't encode character u'\u2019' in position 69: ordinal not in range(128) 
2017-08-20 00:10:46 Failed to send request: 'utf8' codec can't decode byte 0xf0 in position 136: invalid continuation byte 

...但我想是讓不僅僅是TEC更多對錯誤的詳細描述,我想知道它發生的代碼在哪裏,因爲我已經用.encode('utf-8')對所有的字符串進行了插入,並且它仍然像這樣失敗,所以我需要知道錯誤的具體位置(就像我如果我是從終端運行腳本的話 - 我有時會這樣做,但錯誤只發生在某些時候,可能是在處理陌生人物或表情符號等時)。

任何幫助大量讚賞,因爲這是一個令人沮喪的問題。謝謝!

+1

嗨。我知道這並不能直接回答你的問題,但你爲什麼不嘗試使用調試器並逐步解決有問題的功能 - 在每一步你都能看到變量的值,並且你會看到在哪個地方你會得到一個例外。希望有幫助:)(我使用PyCharm進行開發,它提供了一個調試接口) –

+1

而不是你可以使用日誌功能 - https://docs.python.org/2/library/logging.html。不需要重寫正在工作的工具。至於位置,請參閱Danil給你的答案。 – droravr

+0

感謝您的評論,但由於篇幅較長,這是我需要解決此特定問題的方式,因爲腳本需要不斷運行,我只想在此期間發現錯誤。將來我會嘗試使用日誌記錄。 –

回答

1

您可以使用traceback

>>> import traceback 
>>> 
>>> def f(): 
...  if True: 
...   1/0 
... 
>>> try: 
...  f() 
... except: 
...  print(traceback.format_exc()) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "<stdin>", line 3, in f 
ZeroDivisionError: integer division or modulo by zero 
+0

看起來很有希望。我可以將traceback.format_exc()分配給一個變量並使用我的csv寫出來嗎? –

+0

@ the_t_test_1,當然,它會返回一個字符串 –

+0

@ the_t_test_1只是要小心,因爲它有'\ n'。如果這是您要查找的內容,請將問題標記爲已回答 –

1

你真的應該使用logging並添加到格式化 - %(lineno)d

類似:

import logging 
logging.basicConfig(format='%(asctime)s - %(lineno)d %(message)s', level=logging.DEBUG) 
logging.debug('This message should appear on the console') 
logging.info('So should this') 
logging.warning('And this, too') 

如果你需要在閱讀有關文件FileHandler。這種技術也將在未來受益。