【问题标题】:Cannot call variables inside try-catch? [closed]不能在 try-catch 中调用变量? [关闭]
【发布时间】:2020-07-16 06:23:34
【问题描述】:

我正在尝试使用 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。如果失败,则程序将显示自定义错误然后停止进程。否则,它会跳过catch,然后显示用户之前输入的值。相反,该程序不起作用,因为未分配 num。那么使用 try-catch 的正确方法是什么?

【问题讨论】:

  • 将您的第一行更改为double num = 0;。如果您希望程序停止,您可以使用 return 语句退出程序或使用 throw 语句抛出更具体的错误
  • 尽管我很想知道您在问题中提到的更多信息答案显示自定义错误然后停止进程。 - 你所说的“停止进程”是什么意思?您希望该程序停止做什么?它将开始做什么?当它完成执行“catch”块中的代码时,你认为程序下一步会去哪里?我问这个是因为你提出问题的方式暗示了对 c# 程序如何流动的潜在误解,所以我想解决它
  • @CaiusJard 这是我成为自学成才程序员的危险。我只是总结我所看到的。我认为catchreturn; 的替代品,所以我希望程序在遇到错误时停止进入下一步。我可能会以某种方式误解。
  • 应该有更多的编译器错误,你必须把它们都包括在内。目前,您的问题是一个谜,如果不掌握所有细节,就很难回答。

标签: c# try-catch


【解决方案1】:

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!");

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

【讨论】:

  • 好收获!已编辑。
  • If it fails then the program will display a custom error then stop the process. 我认为您最好将 Write 移动到 try 中。
  • @mjwills OP 的含义对我来说是一个非常开放的问题。我想知道他们是否认为 try catch 块之后的所有代码都受到 catch 内某种隐式返回的影响。似乎很清楚对程序流程的一些误解正在发生
【解决方案2】:

如果您尝试将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 值做任何事情。

【讨论】:

    【解决方案3】:

    如果你的 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() 返回一个字符串,而不是双精度。此外,通过在 try 块中声明 num,poster 的最后一行代码将无法访问它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多