Dalam berbagai bahasa (setidaknya Java, pikirkan juga C #?) Anda dapat melakukan hal-hal seperti
if( condition )
singleStatement;
while( condition )
singleStatement;
for( var; condition; increment )
singleStatement;
Jadi, ketika saya hanya memiliki satu pernyataan, saya tidak perlu menambahkan cakupan baru dengan { }
. Mengapa saya tidak bisa melakukan ini dengan try-catch?
try
singleStatement;
catch(Exception e)
singleStatement;
Apakah ada sesuatu yang istimewa tentang try-catch yang mengharuskan selalu memiliki ruang lingkup baru atau sesuatu? Dan jika demikian, bukankah kompiler dapat memperbaikinya?
for
bagian-bagian harus diberi nama sepertiinitial
,condition
danstep
karenainitial
tidak perlu mendefinisikan variabel danstep
tidak perlu kenaikan.if
selalu merupakan pernyataan tunggal, dan banyak pernyataan yang dilampirkan oleh kawat gigi terdiri dari satu pernyataan. Tapi saya salah satu dari mereka yang selalu memasang kawat gigi, jadi ...throw
danreturn
, dan seperti @detly berkata, jika Anda menganggap kawat gigi sebagai satu kelompok pernyataan, saya tidak menemukannya tidak konsisten juga. Saya tidak pernah mengerti apa ini "banyak kesalahan pengkodean" yang disebutkan oleh orang-orang. Orang-orang perlu mulai memperhatikan apa yang mereka lakukan, menggunakan indensi yang tepat dan melakukan tes unit: P tidak pernah punya masalah dengan ini ...Jawaban:
IMO, mereka termasuk dalam Java dan C # terutama karena mereka sudah ada di C ++. Pertanyaan sebenarnya adalah mengapa C ++ seperti itu. Menurut Desain dan Evolusi C ++ (§16.3):
Sunting: Mengenai mengapa ini akan membingungkan, saya pikir kita hanya perlu melihat pernyataan yang salah dalam jawaban @Tom Jeffery (dan, terutama, jumlah suara yang diterima) untuk menyadari bahwa akan ada masalah. Bagi parser, ini benar-benar tidak berbeda dari mencocokkan
else
denganif
s - kurang kawat gigi untuk memaksa pengelompokan lain, semuacatch
klausa akan cocok dengan yang terbaruthrow
. Untuk bahasa-bahasa yang salah yang memasukkannya,finally
klausa akan melakukan hal yang sama. Dari sudut pandang parser, ini hampir tidak cukup berbeda dari situasi saat ini untuk diperhatikan - khususnya, karena tata bahasa berdiri sekarang, benar-benar tidak ada yang mengelompokkancatch
klausa bersama - kurung mengelompokkan pernyataan yang dikendalikan olehcatch
klausa, bukan tangkapan klausa sendiri.Dari sudut pandang menulis parser, perbedaannya hampir terlalu kecil untuk diperhatikan. Jika kita mulai dengan sesuatu seperti ini:
Maka perbedaannya adalah antara:
dan:
Demikian juga, untuk klausa tangkap:
vs.
Definisi blok coba / tangkap lengkap tidak perlu diubah sama sekali. Bagaimanapun itu akan menjadi seperti:
[Di sini saya menggunakan
[whatever]
untuk menunjukkan sesuatu yang opsional, dan saya meninggalkan sintaks untukfinally_clause
karena saya tidak berpikir ada kaitannya dengan pertanyaan.]Bahkan jika Anda tidak mencoba mengikuti semua definisi tata bahasa seperti Yacc di sana, intinya dapat diringkas dengan cukup mudah: bahwa pernyataan terakhir (dimulai dengan
try_block
) adalah pernyataan di manacatch
klausa dicocokkan dengantry
klausa - dan tetap persis seperti itu. sama apakah kawat gigi diperlukan atau tidak.Untuk mengulangi / meringkas: kelompok kawat gigi bersama-sama laporan dikendalikan oleh para
catch
s, tapi lakukan tidak kelompokcatch
s sendiri. Dengan demikian, kawat gigi itu sama sekali tidak berpengaruh pada memutuskan manacatch
yang sesuaitry
. Untuk parser / kompiler, tugasnya sama mudah (atau sulit). Meskipun demikian, jawaban @ Tom (dan jumlah suara yang diterima) memberikan banyak bukti bahwa perubahan semacam itu hampir pasti akan membingungkan pengguna.sumber
try return g(); catch(xxii) error("G() goofed: xxii");
apakah masih rapi IMODalam sebuah jawaban tentang mengapa tanda kurung diperlukan untuk beberapa konstruksi pernyataan tunggal tetapi tidak yang lain , Eric Lippert menulis:
Dengan kata lain, itu lebih mahal bagi tim penyusun untuk mengimplementasikannya daripada dibenarkan, untuk manfaat marjinal yang diberikannya.
sumber
Saya pikir itu untuk menghindari masalah gaya lain. Berikut ini akan menjadi ambigu ...
Ini bisa berarti ini:
Atau...
sumber
if
kasus ini. Sangat mudah untuk mengatakan "baik yang lain mengikat ke dalam jika" dan dilakukan dengan itu. Tetapi untuk mencoba / menangkap itu tidak berhasil.Saya pikir alasan utama adalah bahwa ada sangat sedikit yang dapat Anda lakukan di C # yang akan memerlukan blok coba / tangkap yang hanya satu baris. (Saya tidak bisa memikirkan apa pun sekarang dari atas kepala saya). Anda mungkin memiliki titik valid dalam hal blok tangkap, misalnya pernyataan satu baris untuk mencatat sesuatu tetapi dalam hal keterbacaan, lebih masuk akal (setidaknya bagi saya) untuk meminta {}.
sumber