异常处理:局部变量

时间:2015-02-25 14:41:10

标签: c#-4.0

在以下代码中,可以在n1块中访问整数n2try

catchfinally块无法识别它们。我可以知道原因吗?!如果我尝试在n1块和n2块中打印catchfinally值,则会出现错误。

static void Main(string[] args)
{
    int n1, n2;
    try
    {
        n1 = Convert.ToInt32(Console.ReadLine());
        n2 = Convert.ToInt32(Console.ReadLine());
        int result;
        result = n1 / n2;
        Console.WriteLine("Result  " + result);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error, please provide non zero value for denominator");
        Console.WriteLine("n1 = {0} and n2 = {1}", n1, n2); -> why n1, n2 are unassigned local variables here. 
        Console.ReadLine();
    }
    finally
    {
        Console.ReadLine();
        Console.WriteLine("n1 = {0} and n2 = {1}", n1, n2); -> why n1, n2 are unassigned local variables here. 
    }
}

2 个答案:

答案 0 :(得分:0)

  

然而,它们不被catch捕获并最终阻止。我可以知道原因吗?!

当然 - 他们不是明确分配。想象一下Console.ReadLine抛出异常。您捕获该异常 - 但尚未为n1n2分配值。

您可能希望为它们声明它们提供初始值 - 这样它们总是被明确分配。但是不清楚你想要发生什么,或者为什么你试图在finally块中使用它们。如果你真的想在 finally块之后访问它们,你可以在catch块中返回或重新抛出异常 - 这样,这是到达之后的唯一方法finally块将通过代码将值分配给n1n2,因此它们会被明确分配,您可以从中读取。

答案 1 :(得分:0)

编译器抱怨他们可能被取消分配,因为你只分配到try块内的变量,并且就其而言,并不保证被捕获在作业之前,不会被抛出

尝试将它们初始化为零:

int n1 = 0;
int n2 = 0;