Sikulix Exception
dynabook N40にUbuntuを入れてsikulixでいろいろ試しているのだが、早速いろいろバカな失敗をやってしまっている(笑)。まあ、そうやって経験値を積むのがプログラミンだけど。。昨日やってしまったのはexceptの取り扱いだ。
#
def log_print(m): # デバッグ上の表示を関数にしている
print(m) # 画面にメッセージを出す
#
print(App.openLink("https://google.com")) # 標準ブラウザでgoogle.comを開く
try:
wait("画像.png",15) # 画像.pngが見つかるまで最大15秒待つ
log_prinh("Found.")
except: # 15秒みつからなかったらここへ飛んでくる
log_print("Not found.")
#
click() # 引数なしだと最後にマッチした場所を左クリックする
このソースを見て「これはダメじゃん!」と思ったあなた、センス抜群ですね!(笑)。実は途中までうまく実行されていたのに、急に動かなくなってしまった(涙)。どうやっても画像が一致しなくなってしまったのだ。何度もスクリーンショットを撮りなおしたり、認識度をいろいろ変えてみたり、いろいろやってダメだったので、sikulixのバグか?とか思ったが。。(そんなはずない(笑)) そうこうして半日くらいたったところで、
- あれ?except:ってもしかして画像が見つからないexception以外もキャッチしてる??!!
ことに気づいた。ソースをよーく見ると、なぜか自分の定義した関数に変な文字が紛れ込んでいた(涙)。なにかの拍子に書き換えてしまったらしい。。。pythonはスクリプト言語なので、定義していない関数を書いてもコンパイルエラーを出してくれるわけでなく、実行時のexceptionとして処理されるので、exceptに吸収されてエラーメッセージが出なくなっていた。。
と、pythonのせいにしてしまいそうになるが、よく考えると大昔からjavaでも手抜きで全部一つのExceptionに飛ばして、後で痛い目に合うというのはさんざんやってきた記憶があるのだが、またしても同じことをやってしまった。。。全然進歩していない。。。。 もちろん普通は手抜きせずにこう書く。
try:
wait("画像.png",15) # 画像.pngが見つかるまで最大15秒待つ
log_prinh("Found.")
except FindFailed: # 15秒みつからなかったらここへ飛んでくる
log_print("Not found.")
これなら変な(定義されてない)関数を書いてしまっても、exceptに隠れてしまうことは無く実行時にすぐに気が付く。もし他のexceptionも処理したければ、こんな感じか。
try:
wait("画像.png",15) # 画像.pngが見つかるまで最大15秒待つ
log_prinh("Found.")
except FindFailed: # 15秒みつからなかったらここへ飛んでくる
log_print("Not found.")
except Exception as e: # その他の例外
print("Error happen!!!!")
print(e)
exit(1)
実際に実行してみると関数が間違っているせいで、無事に最後のexceptへ飛びました(笑)。今日の教訓は、
- 手抜きコードは将来の自分の時間を奪い取る
(笑)