C#-保护应用程序不中止

C#-保护应用程序不中止,c#,C#,我的应用程序从串行端口接收一个字符串,格式为“・999999999999999,AAAAA,AAAAA“每6秒一次。 我使用以下语句来处理字符串: stringOut=stringOut.Replace("-",","); string[] valor_1=stringOut.Split(','); int i_C_AR=Convert.ToInt32(lbl_contador.Text); mx_

我的应用程序从串行端口接收一个字符串,格式为“・999999999999999,AAAAA,AAAAA“每6秒一次。 我使用以下语句来处理字符串:

            stringOut=stringOut.Replace("-",",");
            string[] valor_1=stringOut.Split(',');
            int i_C_AR=Convert.ToInt32(lbl_contador.Text);

            mx_02=Convert.ToInt32(valor_1[1])-Convert.ToInt32(valor_1[2]);
            mx_07=Convert.ToInt32(valor_1[2])-Convert.ToInt32(valor_1[3]);
            mx_10=Convert.ToInt32(valor_1[3]);
在大多数情况下,我们得到的字符串没有问题

有时应用程序会因为这些语句后面的某些字符出现错误而中止

mx_02=Convert.ToInt32(valor_1[1])-Convert.ToInt32(valor_1[2]);
mx_07=Convert.ToInt32(valor_1[2])-Convert.ToInt32(valor_1[3]);
mx_10=Convert.ToInt32(valor_1[3]);

如何保护应用程序不被破坏?

首先,你应该弄清楚为什么会得到坏数据。这真的是意料之中的吗?或者它代表了系统中其他地方的一个bug,这可能会导致应用程序终止,而不是继续使用坏数据

您可以使用而不是
转换.ToInt32
。这将允许您检测错误,而不必捕获异常(这是一种替代方法)

TryParse
返回说明解析是否成功的
bool
结果,并使用
out
参数存储结果。在以后执行算术之前,需要引入额外的局部变量来存储解析结果。例如,您可能需要以下内容:

// Rename these to be meaningful - in general your variable names should be
// clearer, and ideally without the underscores
int first, second, third;
if (!int.TryParse(valor_1[1], out first) ||
    !int.TryParse(valor_1[2], out second) ||
    !int.TryParse(valor_1[3], out third))
{
    // Do whatever you need to with invalid input
}
else
{
    mx_02 = first - second;
    mx_07 = second - third;
    mx_10 = third;
}

请注意,这也减少了将要执行的解析操作的数量。

首先,您应该找出获取错误数据的原因。这真的是意料之中的吗?或者它代表了系统中其他地方的一个bug,这可能会导致应用程序终止,而不是继续使用坏数据

您可以使用而不是
转换.ToInt32
。这将允许您检测错误,而不必捕获异常(这是一种替代方法)

TryParse
返回说明解析是否成功的
bool
结果,并使用
out
参数存储结果。在以后执行算术之前,需要引入额外的局部变量来存储解析结果。例如,您可能需要以下内容:

// Rename these to be meaningful - in general your variable names should be
// clearer, and ideally without the underscores
int first, second, third;
if (!int.TryParse(valor_1[1], out first) ||
    !int.TryParse(valor_1[2], out second) ||
    !int.TryParse(valor_1[3], out third))
{
    // Do whatever you need to with invalid input
}
else
{
    mx_02 = first - second;
    mx_07 = second - third;
    mx_10 = third;
}

请注意,这还减少了要执行的解析操作的数量。

您可以使用int.TryParse或捕获异常,这将更简单

try{
// place faulty code here
}catch(Exception ex)
{
// handle exception if you care
}

您可以使用int.TryParse或捕获异常,这将更简单

try{
// place faulty code here
}catch(Exception ex)
{
// handle exception if you care
}


当它“中止”时它说什么?Convert.ToInt32只能接受数字字符串。如果传递了非数字字符串,它注定会失败。当它“中止”时它说什么?Convert.ToInt32只能接受数字字符串。如果传递了非数字字符串,它注定会失败。对可以用TryParse解决的问题抛出try/catch就像只需要一个三明治就点一顿饭:浪费资源。这绝对是一种反模式。他的代码每6秒钟收到一次该消息,很少发生异常。我的选择是使用更少的代码。如果只有一个整数需要解析——你肯定是对的。这不仅仅是性能问题。您还可以屏蔽可能发生的任何其他不可预见的错误。如果我在我所处理的代码库中看到这样的结构,我会去掉它们。我有一个示例:valor_1[]有6个字段。[0]="・06“[1]=“03699”[2]=“01565”[3]=“| | 675”目前我正在用TryParse进行测试,明天我将测试try-catch。尝试/捕捉你可以用TryParse解决的东西就像点一顿饭,而你只需要一个三明治:浪费资源。这绝对是一种反模式。他的代码每6秒钟收到一次该消息,很少发生异常。我的选择是使用更少的代码。如果只有一个整数需要解析——你肯定是对的。这不仅仅是性能问题。您还可以屏蔽可能发生的任何其他不可预见的错误。如果我在我所处理的代码库中看到这样的结构,我会去掉它们。我有一个示例:valor_1[]有6个字段。[0]="・06“[1]=“03699”[2]=“01565”[3]=“| | 675”目前我正在使用TryParse进行测试,明天我将测试try catch。使用上面的代码不再留下此错误。如何将变量的内容连接到标签名中?@user1635148:对不起,不清楚您的意思-但是
string.Format
可能是您所追求的。如何将变量的内容连接到对象名中作为标签?从01年到06年收到的勇气1[0],总是这样。根据这些数字,系统填写了一个标签。示例:lbl\U 01\U temp、lbl\U 02\U temp、lbl\U 03\U temp、lbl\U 04\U temp、lbl\U 05\U temp、lbl\U 06\U temp。@user1635148:这并没有真正澄清任何问题。通常,对象没有名称。听起来你现在真的在问一个不同的问题——所以不要在评论中谈论,而是创建一个新的(清晰的)问题。编辑:因为你的评论被编辑了-不要这样做。如果您有一个变量集合,请将它们放入一个集合(例如数组或列表)。您不应该尝试按名称动态访问变量。这是否有效?如果(!int.TryParse(valor_1[1],out i_1o)|!int.TryParse(valor_1[2],out i_2o)|!int.TryParse(valor_1[3],out i_3o)){mx_02=Convert.ToInt32(“L_-HM”+String.Format(s_-ID)+“02mm”);mx_07=Convert.ToInt32(“L_-HM”String.Format(s)String.ID)+“L_-ID)+“07mm”mx=10+String.ToInt32”(“s”)使用上面的代码不会再留下这个错误。如何将变量的内容连接到标签名中?@user1635148:对不起,不清楚您的意思-但是
string.Format
可能是您所追求的。如何将变量的内容连接到对象名中作为标签?从01年到06年收到的勇气1[0],总是这样。根据这些数字,系统填写了一个标签。示例:lbl\U 01\U temp、lbl\U 02\U temp、lbl\U 03\U temp、lbl\U 04\U temp、lbl\U 05\U temp、lbl\U 06\U temp。@user1635148:这并没有真正澄清任何问题。通常,对象没有名称。听起来你现在真的在问一个不同的问题——所以不要在评论中谈论,而是创建一个新的(清晰的)问题。编辑:因为你的评论被编辑了-不要这样做。如果您有一个变量集合,请将它们放入一个集合(例如数组或列表)。您不应该试图访问var