タイトル通りR言語でtryCatchをするときに、finallyは先に実行される?
Javaは最後に実行だったので驚いた。危うくバグを残すところだった。
R言語
tryCatch({
rep("A",-1) # ここで無理やりエラーを起こす
}, error = function(e) {
print("エラー")
}, warning = function(e) {
print("ワーニング")
}, finnaly = {
print("ファイナリー")
})
実行結果
[1] "ファイナリー"
[1] "エラー"
本当に最初に実行される。「rep("A",-1)
」よりも前に。
finallyは必ず実行する(最後とは言っていない)ということだろうか。
おまけ(java)
java
try{
int a = 0 / 0; // ゼロディバイドを起こす
} catch(ArithmeticException e) {
System.out.println("エラー");
} finally {
System.out.println("ファイナリー");
}
実行結果
エラー
ファイナリー
finallyは先に実行しても後で実行しても大丈夫なコード書きを心がけないとなと思いました。
追記
よく見たら「finally」ではなく「finnaly」と書いてました(汗
正しいfinally
tryCatch({
rep("A",-1) # ここで無理やりエラーを起こす
}, error = function(e) {
print("エラー")
}, warning = function(e) {
print("ワーニング")
}, finally = {
print("ファイナリー")
})
実行結果
[1] "エラー"
[1] "ファイナリー"
R言語でも後で実行ということに。
これ、もしかしたら適当な変数だと先に実行されるのかな?
tryCatch({
rep("A",-1) # ここで無理やりエラーを起こす
}, error = function(e) {
print("エラー")
}, warning = function(e) {
print("ワーニング")
}, aaaa = {
print("適当な変数")
}, finally = {
print("ファイナリー")
})
実行結果
[1] "適当な変数"
[1] "エラー"
[1] "ファイナリー"
わああ、これはこれで気を付けなきゃ・・(汗