2017年12月16日 星期六

Python: 在自訂的exception handling中加入traceback來取得錯誤的行號

在我們寫python程式的過程中,難免會在測試時看到程式因Exception/Error而中止。
中止的時候,會看到畫面印出在哪一行出錯。例如程式當中有一行:
 
int('abc') 
我們會看到以下的錯誤訊息。錯誤訊息主要分成三個部份,分別用不同的底色來表示(之後依序簡稱訊息1、訊息2、訊息3):
Traceback (most recent call last):
  File "./traceback_test.py", line 7, in <module>
    int('abc')
ValueError: invalid literal for int() with base 10: 'abc'
 如果我們用了try...except如下:
try:
    int('abc')
except Exception as e:
    print(e)  
則會得到以下的結果,只有訊息3,錯誤的行號不見了:
invalid literal for int() with base 10: 'abc'
要如何取得訊息1(以取得發生錯誤的行號)和訊息2,甚至是完全一樣的資訊呢?我們需要使用traceback這個module。以下是一個簡單的範例供參考,如果想要更深入瞭解,可以去找python文件:
#!/usr/bin/python3

import sys, traceback

try:
    int('abc')
except Exception as e:
    ex_type, ex, tb = sys.exc_info() #此行取得ex_type, ex, tb
    #印出訊息1: File "./traceback_test.py", line 7, in <module>\n   int('abc')
    print('----traceback.print_tb(tb)----')
    traceback.print_tb(tb)
    #印出訊息2:ValueError
    print('----print(ex_type.__name__)----')
    print(ex_type.__name__)
    #印出訊息3:invalid literal for int() with base 10: 'abc'
    print('----print(ex)----')
    print(ex)
    #印出完整訊息,含Traceback (most recent call last):
    print('----format_exception(ex_type, ex, tb)----')
    msg_lines = traceback.format_exception(ex_type, ex, tb)
    for l in msg_lines:
        print(l, end='')
    #印出完整訊息,含Traceback (most recent call last):
    print('----traceback.format_exc()----')
    msg_str = traceback.format_exc()
    print(msg_str)

2017年12月11日 星期一

二次世界大戰,台灣是戰勝國還是戰敗國?

今天看到有人談「二次世界大戰,台灣是戰勝國還是戰敗國?」這個問題,寫了一大堆。

其實這個問題很簡單:
  • 從「中華民國」的角度來論述歷史,那麼台灣就可以是戰勝國
  • 從「日本」的角度來論述歷史,那麼台灣就一定是戰敗國
  • 從「台灣土地」的角度來論述歷史,那麼所有政權都是過客,台灣本身無勝敗問題
三十年前的歷史課本,是採取中華民國的角度;
後來因為台獨與假台獨黨想要去中國化與贏得選舉利益,
所以採取了台灣土地的角度來寫歷史,
同時利用這個修改,內容當中多說了一些日本人的好話與國民黨的壞話,
讓那些小朋友長大之後比較不會投票給國民黨。

但是,這種作法終究只會促進統一的。
因為那些小朋友來到二三十歲時,會慢慢發現從小被真假台獨騙了好久,
有些人心中就會浮現「不如統一算了,共產黨還比較好」的想法。
近期不是有些太陽花小朋友投共去了嗎?就是這個效應。
等到那個時候,台灣在二戰又會屬於戰勝國的一邊。

最後,我個人的意見,台灣當然是戰敗國。
不過對於那些不肯皇民化,歡喜慶祝日本投降的台灣民眾來說,
說台灣屬於戰敗國又好像太殘忍。
寫國家歷史課本的人,會有較多的考量,
例如增加團結、民族自信心等等,
所以會作一些美化,舉世皆然。

2017年12月4日 星期一

毛小孩皮膚不好怎麼辦?

推薦一款Goodbye Ouch神奇多功能皮膚修護霜。

這款皮膚修護霜是採用有機蜂蠟為基底(而非凡士林之類的石化產物),
紐西蘭原裝進口,完全純天然成份,小baby也可使用。
對於皮膚的諸多不適都有緩解甚至改善的作用。

有朋友想說,連小baby都可以用了,那毛小孩皮膚不好應該也可以吧?
買來用了之後,除了沒有不良副作用,正面的效果也十分令人滿意。



2017年11月27日 星期一

已去除基改段的基改黃豆,作成的豆漿可以喝嗎?

什麼是基因改造農作物?一般人是這麼理解的:
  • 基因改造農作物就是透過植入一些基因段,來增強農作物的一些能力,例如防蟲、防旱....
然後,有些報告說基改農作物制成的食品,對身體健康有疑慮,所以有人說「好,我們來把那些基因段去除,讓它不再含有基改成份」,於是推出了「原本是基因改造,但是收成後又透過了一些方法將去除了植入的基因段」的農作物。所以一般人會這麼理解:
  • 去除基改段的基改農作物,已不含基改成份,所以對健康或許不會有影響
以上是相關行業的人,期待大家如此的理解。
----------------------------------------
 以下是一位曾在該行業已退休的頂尖科學家跟我用白話解釋什麼是基改農作物:

  • 基因改造農作物就是透過植入一些基因段,那些基因段會像癌細胞一樣,不斷的複制自己,來充滿於基改作物中,來增強農作物的一些能力,例如防蟲、防旱....
然後,大家可以想想看,要如何將充滿於基改作物中的基因段去除.....
能去除乾淨嗎? 頂尖科學家跟我說不太可能。
----------------------------------------
以下是個人的猜測。

個人不是大科學家,只能想到或許有一個方法可以去除,
就是用放射線去照,照到整個作物的基因段都重組。
然後,植入的基因段沒了,但是原本正常的基因段也沒了,
吃下去的黃豆,只剩下黃豆的外形,裡面是什麼都不知道了。

不過,就算不是用這個方法,也是用其它的方法達成類似的效果吧?

強調一下,這一部份只是猜測。
大家可以存疑,多找一些證據。

所以,已去除基改段的基改黃豆,作成的豆漿可以喝嗎?
就看大家怎麼想囉。

白芷治牙痛

很久沒吃刨冰了,因為先前有些承受不了冰凍的感覺。
這次有朋自遠方來,幾個人去了永康街,應景吃了小碗的芒果冰(應該堅持點店裡的唯一熱點)。
還沒吃完,嘴裡就受不了了;加上客戶提早見面的時間,為了避免浪費就硬吃了下去。
當下牙齒凍、嘴凍,一個小時之後緩解,但是開始整排牙神經痛。
當天我喝了些熱水,覺得好多了,不過兩天之後,整排牙神經又開始痛。

此時,思考了一下,覺得應該仍是和吃冰有關,是因寒而起,
所以決定吃一些白芷,將受寒的陽明經打通。
我使用的是仙豐的白芷單方,
挖了半匙放入嘴中,正要去取水吞服時,牙痛就好了。
就是幾秒鐘的事。


2017年11月15日 星期三

有些店的便宜咖啡真是難喝

7x已經被列為拒絕往來戶了;這兩天一時興起喝全x,兩次就喝到品質很差的。
速食店的也是,感覺大家都在用調降品質來節省成本?

2017年11月13日 星期一

wkhtmltopdf 的 --page-width 無法使用的解決方法

試著將用html做標籤,然後用wkhtmltopdf轉成pdf,再用列印至使用連續標籤紙的標籤機上。因為標籤高度是彈性的,所以我只設了 --page-width ,但是產生出來的pdf檔不如預期,仍是A4紙張大小。

後來,我試著也設定了 --page-height,然後就可以了。

原來這兩個值是要一起設定才會生效的,如果只設其一,就會使用 --page-size 的預設值 A4。