Di C # dan di Java (dan mungkin juga bahasa lain), variabel yang dideklarasikan dalam blok "coba" tidak berada dalam cakupan di blok "catch" atau "last" yang sesuai. Misalnya, kode berikut tidak dapat dikompilasi:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Dalam kode ini, kesalahan waktu kompilasi terjadi pada referensi ke s di blok catch, karena s hanya dalam ruang lingkup di blok percobaan. (Di Java, kesalahan kompilasi adalah "s tidak dapat diselesaikan"; di C #, "Nama 'tidak ada dalam konteks saat ini".)
Solusi umum untuk masalah ini tampaknya malah mendeklarasikan variabel tepat sebelum blok percobaan, bukan di dalam blok percobaan:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Namun, setidaknya bagi saya, (1) ini terasa seperti solusi yang kikuk, dan (2) itu menghasilkan variabel yang memiliki ruang lingkup lebih besar daripada yang dimaksudkan pemrogram (seluruh sisa metode, bukan hanya dalam konteks coba-tangkap-akhirnya).
Pertanyaan saya adalah, apa alasan di balik keputusan desain bahasa ini (di Java, di C #, dan / atau dalam bahasa lain yang berlaku)?