C # ve Java'da (ve muhtemelen diğer dillerde de), "try" bloğunda bildirilen değişkenler, karşılık gelen "catch" veya "nihayet" bloklarda kapsam dahilinde değildir. Örneğin, aşağıdaki kod derlenmez:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Bu kodda, catch bloğundaki s referansında derleme zamanı hatası oluşur, çünkü s sadece try bloğunun kapsamı içindedir. (Java'da, derleme hatası "çözülemez"; C # 'da, "geçerli bağlamda' s 'adı yok".)
Bu sorunun genel çözümü, try bloğunun yerine, try bloğundan hemen önce değişkenleri bildirmek gibi görünüyor:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Ancak, en azından bana göre, (1) bu tıknaz bir çözüm gibi hissediyor ve (2) değişkenlerin, programlayıcının amaçladığından daha geniş bir kapsama sahip olmasıyla sonuçlanıyor (yalnızca yöntemin bağlamı yerine, yöntemin geri kalanının tamamı) deneyin-catch-son).
Benim sorum, bu dil tasarım kararının arkasındaki gerekçeler nelerdi (Java, C # ve / veya diğer herhangi bir dilde)?