c#尝试捕捉/错误处理

c#尝试捕捉/错误处理,c#,error-handling,C#,Error Handling,我目前正在做一个程序,我正在通过错误处理来完成它。我有几个案例看起来像: int stockbankInput = Convert.ToInt32(Console.ReadLine()); 在这里,用户必须输入1、2、3。我曾尝试使用if语句捕捉错误,如果有人输入空格/字符串/字符或不是1、2或3的数字,但其工作原理与字符串输入不同。以下是我尝试过的: if(stockbankInput == null) { Console.WriteLine("Error: Please enter

我目前正在做一个程序,我正在通过错误处理来完成它。我有几个案例看起来像:

int stockbankInput = Convert.ToInt32(Console.ReadLine());
在这里,用户必须输入1、2、3。我曾尝试使用if语句捕捉错误,如果有人输入空格/字符串/字符或不是1、2或3的数字,但其工作原理与字符串输入不同。以下是我尝试过的:

if(stockbankInput == null)
{
    Console.WriteLine("Error: Please enter either 1, 2 or 3");
    stockbankInput = 0;
    goto menuRestartLine;
}

但是,不能将“null”链接到整数输入,只能链接到字符串。有人能帮忙吗?

使用Int32 TryParse方法:

int input;
var successful = Int32.TryParse(Console.ReadLine(), out input);
if (!successful)
    // do something else
else
    return input;

尝试一下此示例程序:

static void Main(string[] args)
{
    int stockbankInput = 0;

    bool firstTry = true;
    while(stockbankInput < 1 | stockbankInput > 3)
    {
       if(!firstTry)
           Console.WriteLine("Error: Please enter either 1, 2 or 3");

       firstTry = false;
       Int32.TryParse(Console.ReadLine(), out stockbankInput);                
    }
}
static void Main(字符串[]args)
{
int stockbankInput=0;
bool firstTry=true;
而(stockbankInput<1 | stockbankInput>3)
{
如果(!首次尝试)
Console.WriteLine(“错误:请输入1、2或3”);
firstTry=false;
Int32.TryParse(Console.ReadLine(),out stockbankInput);
}
}
首先,不要使用goto语句。他们被认为是不好的做法,阅读你的问题时,这就像是一盏耀眼的红灯——这就是我所能关注的

根据您的问题,
int
Int32
不能为空。所以你不能将它与null进行比较。给它一个默认值,然后检查它

这是一个不需要检查错误,只需要验证输入的场景。使用
TryParse
,如果解析成功,它将设置
out
参数,或者将其设置为
0

接下来,您希望循环,直到获得良好的输入。
如果执行一次
语句,循环将保证当您离开它时,您的输入将是有效的


最后,
firstTry
是一种很好的方法,可以让用户在第一次尝试后知道他们搞砸了。

您正在检查int是否为null,这将始终返回false,因为int不能为null

可以使用“int”(可为null的int),但Convert.ToInt32不会返回null。如果无法解析int的值,它将解析为默认值零。您可以检查返回的int是否为零,也可以进一步检查返回的字符串:

int input = 0;

string errorMessage = "Error: Please enter either 1, 2 or 3";

while(true)
{
    try
    {
        input = Convert.ToInt32(Console.ReadLine());

        if (input == 0 || input > 3)
        {
            Console.WriteLine(errorMessage);
        }
        else
        {
            break;
        }
    }
    catch(FormatException)
    {
         Console.WriteLine(errorMessage);
    }
}

这样,您的返回值“int input”将为0,或者您输入的数字以及由要转换的字符串(包含数字0-9以外的符号)引起的格式异常将被捕捉到try/catch语句中。

您不能在输出位置使用可为null的int。它必须是一个整数。啊,我错了。我已经修改了我的答案以反映实际的类型。谢谢。只是出于好奇,你为什么要使用
goto
语句。。?这将成为调试噩梦,仅供参考…为了避免goto语句(如@MethodMan所示),您可以从下面稍微修改我的答案,并在一段时间内将其包装(!successful){}谢谢!这是一个绝妙的答案,正是我所需要的:)