0

私のアプリは、シリアルポートから「・99,99999,99999,99999、AAAAAA、AAAAAA」の形式の文字列を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]);

アプリを中断しないように保護するにはどうすればよいですか?

4

2 に答える 2

4

まず、悪いデータを取得している理由を解明する必要があります。これは本当に予想されることですか、それともシステムの他の場所にあるバグを表しており、不良データを続行する代わりにアプリが終了する可能性がありますか?

int.TryParseの代わりに使用できますConvert.ToInt32。これにより、例外をキャッチすることなくエラーを検出できます(これは代替手段です)。

TryParsebool解析が成功したかどうかを示す結果を返し、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;
}

これにより、実行する解析操作の数も減ることに注意してください。

于 2012-09-25T09:00:31.610 に答える
0

int.TryParse を使用するか、例外をキャッチすることができます。これはより簡単になります。

try{
// place faulty code here
}catch(Exception ex)
{
// handle exception if you care
}
于 2012-09-25T09:03:01.953 に答える