Saya memiliki sejumlah fungsi yang mengembalikan sesuatu atau membuat kesalahan. Dalam fungsi utama, saya memanggil masing-masing ini, dan ingin mengembalikan nilai yang dikembalikan oleh setiap fungsi, atau melanjutkan ke fungsi kedua jika fungsi pertama memberikan kesalahan.
Jadi pada dasarnya apa yang saya miliki saat ini adalah:
function testAll() {
try { return func1(); } catch(e) {}
try { return func2(); } catch(e) {} // If func1 throws error, try func2
try { return func3(); } catch(e) {} // If func2 throws error, try func3
}
Tetapi sebenarnya saya hanya try
ingin mengembalikannya (yaitu jika tidak menimbulkan kesalahan). Saya tidak butuh catch
blok. Namun, kode suka try {}
gagal karena tidak memiliki catch {}
blok (tidak digunakan) .
Saya memberi contoh di jsFiddle .
Jadi, adakah cara untuk catch
menghilangkan blok - blok itu sambil mencapai efek yang sama?
sumber
null
dan Anda melakukan sesuatu sepertireturn func1() || func2() || func3();
try {}; finally {}
seperti yang ditunjukkan di stackoverflow.com/a/5764505/68210catch (e) {}
, pengecualian yang diberikanfunc1()
akan mencegahfunc2()
dari dicoba.async
fungsi, terkadang. Dipaksa oleh bahasa javascript untuk membuatcatch
blok kosong jelas tidak ada gunanya.Sebuah percobaan tanpa klausa menangkap mengirimkan kesalahannya ke tangkapan yang lebih tinggi berikutnya , atau jendela, jika tidak ada tangkapan yang ditentukan dalam percobaan itu.
Jika Anda tidak mengerti , ekspresi percobaan membutuhkan klausa akhirnya .
sumber
try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}
?Mungkin saja memiliki blok catch kosong, tanpa variabel error, dimulai dengan ES2019 . Ini disebut pengikatan tangkapan opsional dan diterapkan di V8 v6.6, dirilis pada Juni 2018 . Fitur tersebut telah tersedia sejak Node 10 , Chrome 66 , Firefox 58 , Opera 53 dan Safari 11.1 .
Sintaksnya ditampilkan di bawah ini:
Anda masih memerlukan
catch
blok, tetapi blok itu bisa kosong dan Anda tidak perlu meneruskan variabel apa pun. Jika Anda tidak menginginkan blok tangkapan sama sekali, Anda dapat menggunakantry
/finally
, tetapi perhatikan bahwa itu tidak akan menelan kesalahan seperti halnya tangkapan kosong.sumber
try
memblokir. 2. Menangkap kesalahan. 3. Jalankanfinally
blok. 4. Melempar kesalahan. Apakah ini benar?catch
). Kelilingi seluruh kode dengantry
/ yang laincatch
dan Anda akan dapat menemukanThis WILL get logged
kesalahannya.Tidak,
catch
(ataufinally
) adalahtry
teman dan selalu ada sebagai bagian dari coba / tangkap .Namun, sangat valid untuk mengosongkannya, seperti dalam contoh Anda.
Dalam komentar di kode contoh Anda ( Jika func1 melempar kesalahan, coba func2 ), tampaknya yang benar-benar ingin Anda lakukan adalah memanggil fungsi selanjutnya di dalam
catch
blok sebelumnya.sumber
try {...}; try {...}
itu dimungkinkan, arti kode mungkin lebih jelas (coba yang pertama, jika tidak coba yang kedua).return
pernyataan menghentikan apa pun yang datang setelahnya.return
akan menyebabkan fungsi kembali sebelum waktunya. Saya akan memperbarui jawaban saya.try {}; finally {}
seperti yang ditunjukkan di stackoverflow.com/a/5764505/68210finally{}
pada dasarnya memiliki semangat yang sama dengancatch{}
. Saya akan memperbarui jawabannya.Saya tidak akan merekomendasikan coba-akhirnya tanpa tangkapan, karena jika kedua blok percobaan dan akhirnya kesalahan lemparan blok, kesalahan yang dilemparkan pada klausa akhirnya menggelembung dan kesalahan blok percobaan diabaikan, dalam pengujian saya sendiri:
Hasil:
sumber
Mereka bekerja sama dalam setiap bahasa yang saya tahu yang memilikinya (JavaScript, Java, C #, C ++). Jangan lakukan itu.
sumber
catch {my code}
Saya telah memutuskan untuk melihat masalah yang disajikan dari sudut pandang yang berbeda.
Saya telah dapat menentukan cara untuk memperbolehkan dengan dekat pola kode yang diminta sementara sebagian menangani objek kesalahan yang tidak ditangani yang terdaftar oleh pemberi komentar lain.
kode bisa dilihat di @ http://jsfiddle.net/Abyssoft/RC7Nw/4/
try: catch ditempatkan dalam loop for yang memungkinkan jatuh dengan anggun. sekaligus dapat melakukan iterasi melalui semua fungsi yang dibutuhkan. ketika penanganan kesalahan eksplisit diperlukan, larik fungsi tambahan digunakan. di genap kesalahan dan array fungsional dengan elemen penanganan kesalahan bukan fungsi, kesalahan dibuang ke konsol.
Sesuai persyaratan stackoverflow di sini adalah kode sebaris [diedit agar sesuai dengan JSLint (hapus spasi di depan untuk mengonfirmasi), meningkatkan keterbacaan]
</s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> orang </s>
sumber
Jika Anda hanya ingin fungsi 2 dan 3 diaktifkan jika terjadi kesalahan mengapa Anda tidak menempatkannya di blok catch?
sumber
Saya yakin Anda perlu menggunakan fungsi helper seperti:
dan gunakan seperti:
sumber
coba & tangkap seperti 2 sisi dari satu koin. jadi tidak mungkin tanpa usaha.
sumber
try {}; finally {}
seperti yang ditunjukkan di stackoverflow.com/a/5764505/68210Sejak ES2019 Anda dapat dengan mudah menggunakan
try {}
tanpacatch {}
:Untuk info lebih lanjut silakan merujuk ke proposal Michael Ficcara
sumber
catch
masih diperlukan, hanya pengikatan yang tidak diperlukan ...