考えたらわかるだろう?と言うようなことが、ときどき、しばしば、あると思う。
自分から言ったり、相手から言われたり。
Androidのライブラリを作るお仕事をしているのだが、今日、バグが見つかった。
ライブラリに作ったAPIをアプリが呼んで、そのAPI内で例外が発生すると、状態が残ったままになる、というものだ。
APIでは、呼ばれたときにフラグを変化させて、終わると戻すようにしていたのだ。
だから、APIが「終わる」ということにならないと、フラグが戻らない。
そのことはわかっていたから、メソッドを抜けるルートにフラグを戻す処理を書いていたし、IDEが「このexceptionどうする?」と尋ねれば、捕捉するようにしていた。
しかし・・・RuntimeExcetpionが考慮から漏れていた・・・。
Android Studioが賢いのか言語仕様が賢いのかわからんけど、Exceptionをcatchしなかったら警告が出てくれるじゃないか。
あれは、全部チェックしていたのだ。
でも、RuntimeExceptionはそういう対象ではないから、そういう例外が発生することを想定すらしていなかったのですわ。
これがアプリであれば、catchしてなかったら死ぬし、catchしたら処理すれば良いだけだ。
しかしライブラリの場合、自分でスルーしてアプリでcatchされて継続された場合、自分が中断されて状態がおかしくなっていることに気付かないことになってしまうのだ。
なので、RuntimeExceptionはIDEなどが検出できないからcatchしなくても気付かないのもわかるし、APIのreturnルートに終了処理を組み込んでいるからreturnしないとダメというのもわかっているのだけど、両方が重なると「あれ??」となります。
言われてみればわかるのだけど、ライブラリってどう使われるかよくわからないから、そういう作りにしているところは「Exception」でcatchせざるを得ない。
「RuntimeException」で済むのかもしれないけど、なんかもう面倒だし。
あんまり例外のある言語を使ってないから。。。という言い訳をしたいのだけど、あまり意味がないから止めよう。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。