C # 및 Java (및 다른 언어도 가능)에서 "try"블록에 선언 된 변수는 해당 "catch"또는 "finally"블록의 범위에 속하지 않습니다. 예를 들어 다음 코드는 컴파일되지 않습니다.
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
이 코드에서는 catch 블록의 s에 대한 참조에서 컴파일 타임 오류가 발생합니다. s는 try 블록의 범위에만 있기 때문입니다. Java에서 컴파일 오류는 "s 확인할 수 없습니다"이며 C #에서는 "현재 컨텍스트에 's'이름이 없습니다"입니다.
이 문제에 대한 일반적인 해결책은 try 블록 대신 try 블록 바로 앞에 변수를 선언하는 것 같습니다.
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
그러나 적어도 나에게, (1) 이것은 어리석은 해결책처럼 느껴지고 (2) 변수가 프로그래머가 의도 한 것보다 더 넓은 범위를 갖습니다 (메소드의 맥락 에서만가 아니라 메소드의 전체 나머지). 마지막으로 시도하십시오.
내 질문은이 언어 디자인 결정의 근거가 무엇입니까 (Java, C # 및 / 또는 기타 적용 가능한 언어)?