そこでLanguage tourを見直しました。
Exceptionのところをみると
NullでないObjectは何でも投げられる!
ということで、いろいろThrowしてみました。
まずはint
try {
throw 1;
} catch (e) {
print('What is thrown: $e');
}
結果は
What is thrown: 1
投げられました!いくつか続けて試します。boolとsymbolsとclassです。
printDivider();
try {
throw false;
} catch (e) {
print('What is thrown: $e');
}
printDivider();
try {
int i = 0;
throw #i;
} catch (e) {
print('What is thrown: $e');
}
printDivider();
try {
var h = Hoge(0);
throw h;
} catch (e) {
print('What is thrown: $e');
}
結果は
-----------------
What is thrown: false
-----------------
What is thrown: Symbol("i")
-----------------
What is thrown: Instance of 'Hoge'
投げてもいいんですね。
ふとclassにinstanceを渡さなかったらどうなるのかなと思い試してみました。
try {
Hoge h;
throw h;
} catch (e) {
print('What is thrown: $e');
}
結果は
What is thrown: Throw of null.
行けましたね。コンパイルエラーとかにならないですね。non-nullオブジェクトって言ってた気がしますがいけました。
じゃあ、null自体は?
try {
throw null;
} catch (e) {
print('What is thrown: $e');
}
結果は
What is thrown: Throw of null.
これも、いけます。ほんとになんでも投げられますね。
関数は。。。
試してみました。
try {
var f = (int i) {
return i + 1;
};
print(f(1));
throw f;
} catch (e) {
print('What is thrown: $e');
print(e(2));
}
結果は
2
What is thrown: Closure 'main_closure'
3
catchした後にも関数として利用できるのは面白いです。何に使うんだって話ですが。
ちなみに、
try {
var f = (int i) {
return i + 1;
};
throw f;
} catch (e) {
print('What is thrown: $e');
print(e(2));
}
このように、tryのなかのprintを消してみたら、DartPadでは、結果は
What is thrown: Closure 'main_closure0'
Uncaught TypeError: i.$add is not a functionError: TypeError: i.$add is not a function
のようになってしまいました。Flutter上で実行したら
I/flutter ( 7570): What is thrown: Closure: (int) => int
I/flutter ( 7570): 3
といった感じで成功したので、Platformによって挙動がちょっと違うみたいです。詳しい人いたら教えて下さい。
サンプルは下にあります。
https://dartpad.dartlang.org/29bb6a884331c48abb9091a7f3c9941b
Flutter(Android)で実行した場合のログは以下のような感じです。
https://gist.github.com/matsuhiro/8700addb5939dc33be3433d055a96bc3
でも、ここでの内容は、使うことは無いと思います。
ドキュメントにも、こう書かれていますし。
0 件のコメント:
コメントを投稿