C# 无法在try-catch中调用变量?

C# 无法在try-catch中调用变量?,c#,try-catch,C#,Try Catch,我正在尝试使用try-catch制作一个防错程序,但它并没有像我预期的那样工作 double num; Console.Write("Input a number: "); try { num = Console.ReadLine(); // Don't mind this, I know this is a mistake } catch { Console.WriteLine("The value you entered is not a numb

我正在尝试使用try-catch制作一个防错程序,但它并没有像我预期的那样工作

double num;

Console.Write("Input a number: ");
try
{
   num = Console.ReadLine(); // Don't mind this, I know this is a mistake
}
catch
{
   Console.WriteLine("The value you entered is not a number!");
}
Console.Write(num); // Error use of unassigned local variables 'num'. why??
我想到的是程序将尝试将值分配给
num
。如果失败,程序将显示自定义错误,然后停止进程。否则,它将跳过捕获,然后显示用户以前输入的值。相反,程序无法工作,因为没有分配num。使用try-catch的正确方法是什么?

Console.ReadLine()
返回字符串,而不是双精度字符串。此外,每个变量在使用前都必须初始化。您可以按如下方式修改程序:

double num = double.MinValue;

Console.Write("Input a number: ");
try
{
    var input = Console.ReadLine();
    num = double.Parse(input);
}
catch
{
    Console.WriteLine("The value you entered is not a number!");
}

// Your output will still be double.MinValue if your catch block is hit. Probably not the best program flow.
Console.Write(num); 
以下是另一种(更好的)方法:

if (double.TryParse(Console.ReadLine(), out var parsed))
    Console.WriteLine(parsed);
else
    Console.WriteLine("The value you entered is not a number!");

此解决方案更好,因为它避免了作为普通程序流控制的一部分引发异常。

如果try块中有错误,则catch块中没有任何内容可以设置num的值。如果在该点显示num的值,则不会显示任何内容。尝试为num指定一个默认值,该值将向您指示存在某种错误,或者将所有内容放入Try块:

Console.Write("Input a number: ");
try
{
   double num;
   num = Console.ReadLine();
   Console.Write(num);
}
catch
{
   Console.WriteLine("The value you entered is not a number!");
}

如果您试图将
Console.ReadLine()
解析为双精度,可以使用
TryParse()
方法:

Console.Write("Input: ");
string userInput = Console.WriteLine();
double num;

if (double.TryParse(userInput, out num) == false) 
{
    Console.WriteLine(userInput +" is not a number");
    return;
}

Console.Write(num);

其次,我建议您在catch中设置一个
return
,以便在您输入num值时不要对其进行任何操作。

将第一行更改为
double num=0。如果您希望程序停止,您可以使用return语句退出程序,或使用throw语句抛出更具体的错误此处回答尽管我很想知道更多关于您在问题中提到的内容显示自定义错误,然后停止进程。-你说的“停止进程”是什么意思?你希望程序停止做什么?它将开始做什么呢?当它在“catch”块内完成代码的执行时,您认为程序下一步会去哪里?我问这个问题是因为你对这个问题的措辞暗示了对c#程序流程的潜在误解,所以我想开始讨论it@CaiusJard这就是我成为自学成才的程序员的危险。我只是总结一下我所看到的。我认为
catch
return的替代品因此,如果程序捕捉到错误,我希望程序停止进入下一步。我可能有点误解了。应该有更多的编译器错误,你必须把它们都包括进去。目前,您的问题是一个谜语,如果没有所有详细信息就很难回答。
Console.ReadLine()
返回字符串,而不是双精度字符串。另外,通过在try块中声明
num
,海报的最后一行代码无法访问它。很好!编辑它。
如果失败,程序将显示自定义错误,然后停止该过程。
我认为您最好将
写入
移动到
尝试
@mjwills操作意味着什么,这对我来说是一个非常开放的问题。我想知道他们是否认为try-catch块之后的所有代码都受到catch中某种隐式返回的影响。。很明显,对程序流程存在一些误解