Bagaimana cara kerja pernyataan pengembalian di dalam blok coba / tangkap?
function example() {
try {
return true;
}
finally {
return false;
}
}
Saya mengharapkan keluaran dari fungsi ini true
, tetapi sebaliknya false
!
Jawaban:
Akhirnya selalu dijalankan. Untuk itulah, yang berarti pengembaliannya digunakan dalam kasus Anda.
Anda akan ingin mengubah kode Anda menjadi seperti ini:
function example() { var returnState = false; // initialisation value is really up to the design try { returnState = true; } catch { returnState = false; } finally { return returnState; } }
Secara umum Anda tidak pernah ingin memiliki lebih dari satu pernyataan pengembalian dalam suatu fungsi, hal-hal seperti inilah alasannya.
sumber
Menurut ECMA-262 (5ed, Desember 2009), di hlm.96:
Dan dari hal.36:
Sudah jelas bahwa
return false
akan menetapkan jenis penyelesaian akhirnya sebagai pengembalian , yang menyebabkantry ... finally
harus dilakukan 4. Kembali F .sumber
Saat Anda menggunakan
finally
, kode apa pun di dalam blok itu diaktifkan sebelum metode keluar. Karena Anda menggunakan pengembalian difinally
blok, itu memanggilreturn false
dan menimpa yang sebelumnyareturn true
ditry
blok.(Terminologi mungkin kurang tepat.)
sumber
Penulisan ulang blok terakhir coba blokir kembali (secara kiasan).
Hanya ingin menunjukkan, bahwa jika Anda mengembalikan sesuatu dari akhirnya, maka itu akan dikembalikan dari fungsinya. Tetapi jika pada akhirnya tidak ada kata 'kembali' - itu akan dikembalikan nilai dari blok percobaan;
function example() { try { return true; } finally { console.log('finally') } } console.log(example()); // -> finally // -> true
Jadi-akhirnya-
return
menulis ulang kembalinya -try-return
.sumber
mengapa Anda mendapatkan kesalahan adalah Anda dikembalikan dalam blok terakhir. akhirnya blok harus selalu dijalankan. jadi
return true
perubahanmu menjadireturn false
function example() { try { return true; } catch { return false; } }
sumber
Sejauh yang saya tahu,
finally
blok selalu dijalankan, terlepas dari apakah Anda memilikireturn
pernyataan di dalamnyatry
atau tidak. Ergo, Anda mendapatkan nilai yang dikembalikan olehreturn
pernyataan di dalam blok akhirnya.Saya menguji ini dengan Firefox 3.6.10 dan Chrome 6.0.472.63 keduanya di Ubuntu. Kode ini mungkin berlaku berbeda di browser lain.
sumber
Referensi: developer.mozilla.org
sumber
Saya akan memberikan jawaban yang sedikit berbeda di sini: Ya, blok
try
danfinally
dieksekusi, danfinally
lebih diutamakan daripada nilai "pengembalian" sebenarnya untuk suatu fungsi. Namun, nilai kembali ini tidak selalu digunakan dalam kode Anda.Inilah alasannya:
res.send()
dari Express.js, yang membuat respons HTTP dan mengirimkannya.try
danfinally
blok keduanya akan menjalankan fungsi ini seperti:try { // Get DB records etc. return res.send('try'); } catch(e) { // log errors } finally { return res.send('finally'); }
Kode ini akan menampilkan string
try
di browser Anda. JUGA, contoh akan menunjukkan kesalahan di konsol Anda. Theres.send()
fungsi disebut dua kali . Ini akan terjadi dengan apa pun yang merupakan fungsi. Blok coba-tangkap-akhirnya akan mengaburkan fakta ini ke mata yang tidak terlatih, karena (secara pribadi) saya hanya mengaitkanreturn
nilai dengan lingkup fungsi.Taruhan terbaik Anda adalah tidak pernah menggunakan
return
di dalamfinally
blok . Ini akan memperumit kode Anda dan berpotensi menutupi kesalahan.Faktanya, ada pengaturan aturan inspeksi kode default di PHPStorm yang memberikan "Peringatan" untuk ini:
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
Jadi apa yang kamu gunakan
finally
?Saya akan menggunakan
finally
hanya untuk membersihkan barang-barang. Apa pun yang tidak penting untuk nilai kembalian suatu fungsi.Mungkin masuk akal jika Anda memikirkannya, karena saat Anda bergantung pada baris kode di bawah
finally
, Anda berasumsi bahwa mungkin ada kesalahan dalamtry
ataucatch
. Tapi 2 yang terakhir itu adalah blok bangunan penanganan error yang sebenarnya. Cukup gunakanreturn
dalamtry
dancatch
sebagai gantinya.sumber
Akhirnya diharapkan SELALU berjalan di akhir blok coba tangkap sehingga (menurut spesifikasi) adalah mengapa Anda mendapatkan kesalahan kembali. Perlu diingat bahwa sangat mungkin browser yang berbeda memiliki implementasi yang berbeda.
sumber
Bagaimana dengan ini?
doubleReturn(); function doubleReturn() { let sex = 'boy'; try { return sex; console.log('this never gets called...'); } catch (e) {} finally { sex = 'girl'; alert(sex); } }
sumber