C#-保护应用程序不中止
我的应用程序从串行端口接收一个字符串,格式为“・999999999999999,AAAAA,AAAAA“每6秒一次。 我使用以下语句来处理字符串: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_
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