Try-catch dimaksudkan untuk membantu dalam penanganan pengecualian. Ini berarti, entah bagaimana, itu akan membantu sistem kami menjadi lebih kuat: cobalah untuk pulih dari peristiwa yang tidak terduga.
Kami menduga sesuatu mungkin terjadi ketika mengeksekusi dan instruksi (mengirim pesan), sehingga terlampir dalam percobaan. Jika sesuatu yang hampir tak terduga terjadi, kita dapat melakukan sesuatu: kita menulis tangkapan. Saya tidak berpikir kami dipanggil untuk hanya mencatat pengecualian. Saya kira catch block dimaksudkan untuk memberi kita kesempatan untuk pulih dari kesalahan.
Sekarang, katakanlah kita pulih dari kesalahan karena kita dapat memperbaiki apa yang salah. Sangat bagus untuk mencoba ulang:
try{ some_instruction(); }
catch (NearlyUnexpectedException e){
fix_the_problem();
retry;
}
Ini akan dengan cepat jatuh dalam loop abadi, tetapi katakanlah fix_the_problem mengembalikan true, lalu kita coba lagi. Karena tidak ada hal seperti itu di Jawa, bagaimana ANDA akan menyelesaikan masalah ini? Apa kode desain terbaik Anda untuk menyelesaikan ini?
Ini seperti pertanyaan filosofis, mengingat bahwa saya sudah tahu apa yang saya minta tidak secara langsung didukung oleh Jawa.
sumber
remove()
darijava.util.Queue
, yang mana danInvalidElementException
kapan antriannya kosong. Alih-alih bertanya apakah itu kosong, saya mengecam tindakan dalam try-catch (yang dalam konkurensi menjadi wajib bahkan dengan sebelumnya jika). Dalam kasus seperti itu, dicatch
blok saya akan meminta untuk mengisi ulang antrian dengan lebih banyak elemen lalu, coba lagi. Voila.Jawaban:
Anda harus melampirkan lingkaran
try-catch
di dalam Andawhile
seperti ini: -Saya telah mengambil
count
danmaxTries
menghindari berlari ke loop yang tak terbatas, kalau - kalau pengecualian terus terjadi di Andatry block
.sumber
maxTries
. Jika tidak maka akan berjalan menjadiinfinite loop
jika pengguna terus memberikan input yang salah, dan karenanya tidak akan keluar. Sama-sama. :)Solusi "giat" wajib:
Dan untuk menelepon:
sumber
Seperti biasa, desain terbaik tergantung pada keadaan tertentu. Namun biasanya, saya menulis sesuatu seperti:
sumber
continue
diperlukan di sana .. Dan Anda bisa membalik kondisi if.Meskipun
try/catch
menjadiwhile
strategi terkenal dan baik saya ingin menyarankan Anda panggilan rekursif:sumber
limit
hitungan metode yang sedang berulang? Berbeda dengan versi loop, yang akan melempar pada tingkat 'asli' ...void retry(int times) { (...) if (times==0) throw w; retry(times--);
Skenario tepat Anda ditangani melalui Failsafe :
Cukup mudah.
sumber
Anda dapat menggunakan penjelasan AOP dan Java dari aspek jcabi (saya seorang pengembang):
Anda juga dapat menggunakan
@Loggable
dan@LogException
anotasi.sumber
fix_the_problem();
di blok tangkapSebagian besar jawaban ini pada dasarnya sama. Milik saya juga, tapi ini adalah bentuk yang saya suka
sumber
fix_the_problem
setelah upaya terakhir. Itu bisa menjadi operasi yang mahal dan bisa menghabiskan waktu.if (tryCount < max) fix()
- tetapi ini adalah format pendekatan umum; detailnya akan tergantung pada kasus tertentu. Ada juga Retryer berbasis jambu yang telah saya lihat.Spring AOP dan solusi berbasis anotasi:
Penggunaan (
@RetryOperation
adalah anotasi khusus kami untuk pekerjaan itu):Kita membutuhkan dua hal untuk mencapai hal ini: 1. antarmuka anotasi, dan 2. aspek pegas. Inilah salah satu cara untuk mengimplementasikan ini:
Antarmuka Anotasi:
Aspek Musim Semi:
sumber
Gunakan
while
lingkaran denganstatus
bendera lokal . Inisialisasi bendera sebagaifalse
dan aturtrue
ketika operasi berhasil, misalnya di bawah ini:Ini akan terus mencoba ulang hingga berhasil.
Jika Anda ingin mencoba lagi hanya beberapa kali saja maka gunakan penghitung juga:
Ini akan mencoba maks 10 kali jika tidak berhasil sampai kemudian akan keluar jika berhasil sebelumnya.
sumber
!success
saat Anda, Anda bisa keluar saat ketika kesuksesan itu benar.success
tempat Anda dicatch
. Jadi sepertinya berlebihan untuk memeriksanya, pada setiap putarancatch
.success
. Cobalah.Ini adalah pertanyaan lama tetapi solusinya masih relevan. Berikut ini adalah solusi umum saya di Java 8 tanpa menggunakan perpustakaan pihak ketiga:
Mari kita uji kasus seperti:
sumber
Cara sederhana untuk memecahkan masalah ini adalah dengan membungkus try / catch dalam loop sementara dan mempertahankan hitungan. Dengan cara ini Anda bisa mencegah loop tak terbatas dengan memeriksa hitungan terhadap beberapa variabel lain sambil mempertahankan log kegagalan Anda. Itu bukan solusi yang paling indah, tetapi itu akan berhasil.
sumber
Gunakan do-while untuk merancang blok coba ulang.
sumber
Dalam hal ini berguna, beberapa pilihan lain untuk dipertimbangkan, semua dilemparkan bersama (stopfile alih-alih coba lagi, tidur, lanjutkan loop yang lebih besar) semua mungkin membantu.
sumber
Anda dapat menggunakan https://github.com/bnsd55/RetryCatch
Contoh:
Alih-alih
new ExampleRunnable()
Anda dapat melewati fungsi anonim Anda sendiri.sumber
Jika tidak semua pengecualian memerlukan percobaan ulang, hanya beberapa saja. Dan jika setidaknya satu percobaan harus dilakukan, Berikut adalah metode utilitas alternatif:
Pemakaian:
sumber
Semua yang dilakukan Try-Catch memungkinkan program Anda gagal dengan anggun. Dalam pernyataan tangkap, Anda biasanya mencoba mencatat kesalahan, dan mungkin memutar kembali perubahan jika perlu.
sumber
(!finished)
?while(finished)
. Saya lebih suka menggunakan versi yang lebih verbose.while(!finished)
terlihat sepertiwhile (finished)
??IsPopulated()
yang baru saja kembali!IsNullOrEmpty()
untuk memastikan bahwa maksud saya dipahami oleh semua pengembang.Saya tahu sudah ada banyak jawaban serupa di sini, dan jawaban saya tidak jauh berbeda, tetapi saya tetap akan mempostingnya karena ini berkaitan dengan kasus / masalah tertentu.
Ketika berhadapan dengan
facebook Graph API
inPHP
Anda terkadang mendapatkan kesalahan, tetapi segera mencoba kembali hal yang sama akan memberikan hasil positif (untuk berbagai magis alasan internet yang berada di luar lingkup pertanyaan ini). Dalam hal ini tidak perlu memperbaiki kesalahan apa pun, tetapi cukup mencoba lagi karena ada semacam "kesalahan facebook".Kode ini digunakan segera setelah membuat sesi facebook:
Juga, dengan memiliki
for
loop menghitung mundur ke nol ($attempt--
) membuatnya cukup mudah untuk mengubah jumlah upaya di masa depan.sumber
berikut ini solusi saya dengan pendekatan yang sangat sederhana!
sumber
Saya tidak yakin apakah ini cara "Profesional" untuk melakukannya dan saya tidak sepenuhnya yakin apakah itu berfungsi untuk semuanya.
sumber
https://github.com/tusharmndr/retry-function-wrapper/tree/master/src/main/java/io
sumber
Di sini pendekatan yang dapat digunakan kembali dan lebih umum untuk Java 8+ yang tidak memerlukan perpustakaan eksternal:
Pemakaian:
sumber
Masalah dengan solusi yang tersisa adalah bahwa, fungsi koresponden mencoba terus menerus tanpa interval waktu di antaranya, sehingga membanjiri tumpukan.
Mengapa tidak
try
hanya setiap detik dan iklan saja ?Di sini solusi menggunakan
setTimeout
dan fungsi rekursif:Ganti fungsi
Run()
dengan fungsi atau kode yang ingin Anda ulangtry
setiap detik.sumber
Cobalah menggunakan springs @ annotation, metode di bawah ini akan mencoba lagi selama 3 upaya ketika RuntimeException terjadi
sumber
Cuplikan di bawah ini menjalankan beberapa cuplikan kode. Jika Anda mendapatkan kesalahan saat menjalankan cuplikan kode, tidur selama M milidetik dan coba lagi. Tautan referensi .
sumber
Berikut ini adalah solusi saya mirip dengan beberapa orang lain dapat membungkus suatu fungsi, tetapi memungkinkan Anda untuk mendapatkan nilai kembali fungsi, jika itu berhasil.
sumber