try-catch-finallyの挙動を調べてみる
try-catch-finallyのcatchの中でreturnや例外発生をさせた場合の挙動を調べてみます。
対象言語はJavaScript、PHPです。
結論としては、JavaScriptとPHPで挙動は同じです。
結論
- catch内のreturn文は動作しない
- catch内で例外発生した場合
- finallyが実行される
- 例外も発生される
上記の動作となりました。
JavaScript
JavaScriptでcatchの中でreturnした場合
↓調査した際のプログラム↓
function test() { try { throw 'error' }catch(e){ console.log('catch'); return 'catch return'; }finally{ console.log('finally'); return 'finally return'; } } console.log(test());
↓出力結果↓
catch finally finally return
catchのあとにfinallyが実行されていることが分かる
→catch内のreturn文は動作していない。
JavaScriptでcatchの中で例外発生した場合
↓調査した際のプログラム↓
unction test() { try { try { throw 'error' }catch(e){ console.log('catch'); throw 'catch error' }finally{ console.log('finally'); } }catch(e){ return 'catch error2' } } console.log(test());
↓出力結果↓
catch finally catch error2
catchのあとにfinallyが実行されていることが分かる。同時にcatchに投げ、例外も発生している。
PHP
PHPでcatchの中でreturnした場合
↓調査した際のプログラム↓
<?php try { throw new Exception('error'); } catch(Exception $error) { print "catch\n"; return; } finally { print "finally\n"; return; }
↓出力結果↓
catch finally
catchのあとにfinallyが実行されていることが分かる
→JavaScript同様、catch内のreturn文は動作していない。
PHPでcatchの中で例外発生した場合
↓調査した際のプログラム↓
<?php try { try { throw new Exception('error'); } catch(Exception $error) { print "catch\n"; throw $error; } finally { print "finally\n"; } } catch(Exception $error) { print "catch2\n"; }
↓出力結果↓
catch finally catch2
JavaScriptと同様にcatchのあとにfinallyが実行されていることが分かる。同時にcatchに投げ、例外も発生している。