Why aren't variables declared in “try” in scope in “catch” or “finally”?

后端 未结 28 2650
时光说笑
时光说笑 2020-11-28 03:44

In C# and in Java (and possibly other languages as well), variables declared in a \"try\" block are not in scope in the corresponding \"catch\" or \"finally\" blocks. For e

28条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-28 04:01

    Two things:

    1. Generally, Java has just 2 levels of scope: global and function. But, try/catch is an exception (no pun intended). When an exception is thrown and the exception object gets a variable assigned to it, that object variable is only available within the "catch" section and is destroyed as soon as the catch completes.

    2. (and more importantly). You can't know where in the try block the exception was thrown. It may have been before your variable was declared. Therefore it is impossible to say what variables will be available for the catch/finally clause. Consider the following case, where scoping is as you suggested:

      
      try
      {
          throw new ArgumentException("some operation that throws an exception");
          string s = "blah";
      }
      catch (e as ArgumentException)
      {  
          Console.Out.WriteLine(s);
      }
      

    This clearly is a problem - when you reach the exception handler, s will not have been declared. Given that catches are meant to handle exceptional circumstances and finallys must execute, being safe and declaring this a problem at compile time is far better than at runtime.

提交回复
热议问题