Yang mana:
using (var myObject = new MyClass())
{
try
{
// something here...
}
catch(Exception ex)
{
// Handle exception
}
}
ATAU
try
{
using (var myObject = new MyClass())
{
// something here...
}
}
catch(Exception ex)
{
// Handle exception
}
c#
try-catch
using-statement
Xaqron
sumber
sumber
}
dariusing
pernyataan dapat membuang pengecualian sebagai diingatkan di sini .finally
disebut metode buang.Jawaban:
Saya lebih suka yang kedua. Semoga juga menjebak kesalahan yang berkaitan dengan penciptaan objek juga.
sumber
try
blok, yang memungkinkan Anda untuk memunculkan pesan kesalahan jika ada yang gagal, program sekarang memiliki kemampuan untuk memulihkan dan memberi tahu pengguna.using( DBConnection conn = DBFactory.getConnection())
yang perlu dibatalkan jika ada pengecualian. Menurut saya keduanya memiliki tempat masing-masing.Karena blok menggunakan hanyalah penyederhanaan sintaks dari coba / akhirnya ( MSDN ), secara pribadi saya akan mengikuti yang berikut, meskipun saya ragu itu sangat berbeda dari opsi kedua Anda:
sumber
finally
blok lebih disukai daripadausing
pernyataan itu?finally
blok yang membuang objek IDisposable adalah apa yangusing
dilakukan pernyataan. Secara pribadi, saya suka ini daripadausing
blok tertanam karena saya pikir ini lebih bersih menyatakan di mana semuanya terjadi, dan itu semua pada "level" yang sama. Saya juga suka ini lebih dari beberapausing
blok tertanam ... tapi itu semua hanya preferensi saya.try
pernyataan untuk dibuang di dalamfinally
pernyataan; jika tidak, itu akan menimbulkan kesalahan kompiler: "Penggunaan variabel lokal yang belumCannot assign null to implicitly-typed local variable
;) Tapi saya tahu apa yang Anda maksud dan secara pribadi lebih suka ini daripada menggunakan blok pakai.Tergantung. Jika Anda menggunakan Windows Communication Foundation (WCF),
using(...) { try... }
tidak akan berfungsi dengan benar jika proksi dalamusing
pernyataan berada dalam keadaan pengecualian, yaitu Membuang proksi ini akan menyebabkan pengecualian lain.Secara pribadi, saya percaya pada pendekatan penanganan minimal, yaitu hanya menangani pengecualian yang Anda sadari pada titik eksekusi. Dengan kata lain, jika Anda tahu bahwa inisialisasi variabel dalam
using
dapat membuang pengecualian tertentu, saya membungkusnya dengantry-catch
. Demikian pula, jika di dalamusing
tubuh sesuatu terjadi, yang tidak terkait langsung dengan variabelusing
, maka saya membungkusnya dengan yang laintry
untuk pengecualian khusus itu. Saya jarang menggunakanException
di sayacatch
es.Tapi saya suka
IDisposable
danusing
mungkin saya bias.sumber
Jika pernyataan tangkap Anda perlu mengakses variabel yang dideklarasikan dalam pernyataan menggunakan, maka di dalam adalah satu-satunya pilihan Anda.
Jika pernyataan tangkapan Anda membutuhkan objek yang direferensikan dalam penggunaan sebelum dibuang, maka di dalam adalah satu-satunya pilihan Anda.
Jika pernyataan tangkapan Anda mengambil tindakan berdurasi tidak diketahui, seperti menampilkan pesan kepada pengguna, dan Anda ingin membuang sumber daya Anda sebelum itu terjadi, maka di luar adalah pilihan terbaik Anda.
Setiap kali saya memiliki scenerio yang mirip dengan ini, blok try-catch biasanya dalam metode yang berbeda lebih jauh dari tumpukan panggilan dari menggunakan. Itu tidak khas untuk metode untuk mengetahui bagaimana menangani pengecualian yang terjadi di dalamnya seperti ini.
Jadi rekomendasi umum saya ada di luar — jauh di luar.
sumber
Keduanya adalah sintaks yang valid. Ini benar-benar tergantung pada apa yang ingin Anda lakukan: jika Anda ingin menangkap kesalahan terkait dengan membuat / membuang objek, gunakan yang kedua. Jika tidak, gunakan dulu.
sumber
Ada satu hal penting yang akan saya panggil di sini: Yang pertama tidak akan menangkap pengecualian yang muncul karena memanggil
MyClass
konstruktor.sumber
Dari C # 8.0, saya lebih suka menggunakan yang kedua sama seperti ini
lalu
sumber
Jika objek yang Anda inisialisasi di blok Using () mungkin melempar pengecualian apa pun, maka Anda harus memilih sintaks kedua jika tidak keduanya sama-sama valid.
Dalam skenario saya, saya harus membuka file dan saya melewati filePath di konstruktor objek yang saya inisialisasi di blok Using () dan mungkin membuang pengecualian jika filePath salah / kosong. Jadi dalam hal ini, sintaks kedua masuk akal.
Kode sampel saya: -
sumber
Dari C # 8.0 pada , Anda dapat menyederhanakan
using
pernyataan di bawah beberapa kondisi untuk menyingkirkan blok bersarang, dan kemudian hanya berlaku untuk blok terlampir.Jadi dua contoh Anda dapat direduksi menjadi:
Dan:
Keduanya cukup jelas; dan kemudian itu mengurangi pilihan antara keduanya menjadi masalah apa yang Anda inginkan ruang lingkup objek menjadi, di mana Anda ingin menangani kesalahan instantiation, dan ketika Anda ingin membuangnya.
sumber