1

I have a asp:BoundColumn with DateTime? data (i'll call it column X) in the asp:GridView. I loop through all the rows in the grid, and cast the .Text property to column X to DateTime (i need this to do some checking and change the cell background color if needed).

I have 2 options:

  1. wrap the cast in try/catch ... handle FormatException (in case column X gets rendered with some junk in it) ... and work only with valid DateTime values.

  2. check the column X to make sure it's in the correct format (how?) before casing, and only cast if format is ok.

Which approach should i take, and why?

Thank you.

p.s. 1 up-vote for all explanations, accepted answer for TryParse

Edit2: even though i used TryParse, I've unchecked the accepted answer to keep the discussion going.

My "good data"/"bad data" ratio is about 2/1 - this means lots of bad input

I'll re-accept the answer in a couple of days, if nothing else comes up.

4

7 に答える 7

13

You could do the 2nd option. DateTime.TryParse can help.

于 2009-02-10T07:53:43.297 に答える
3

それはあなたがそれが間違ったフォーマットであると予想する頻度に少し依存すると思います。例外がめったに発生しない場合、try-catchで何かをラップしても、実際にはまったく影響はありません。しかし、それが大幅に引き上げられることを期待している場合は、おそらくそれにチェックを追加する必要があります。

于 2009-02-10T07:54:15.573 に答える
3

私は2番目のオプションに行きます。通常のコードに例外を使用することはありません。これは、Visual Studio のオプション「例外がスローされたときにデバッガーに入る」を使用して実行できるためです。

これにより、デバッガーが他の場所ではなく実際の問題で停止するため、コード内の実際の問題を特定する際に多くの時間を節約できます。問題のない問題に例外が使用されている場合、これを確実に行うことはできません。

于 2009-02-10T07:55:40.000 に答える
2

例外は、発生させてキャッチするために多くのリソースを必要とします。よりエレガントなオプションが利用可能な場合は、それらをスローさせないようにする必要があります。

于 2009-02-10T07:58:03.800 に答える
2

私が従うルール: 常にできるだけ多くのエラーを手動でキャッチするようにし、最後の手段として例外を使用します。

例外はパフォーマンスに影響を与えます。

于 2009-02-10T07:59:52.470 に答える
1

注意すべきことの 1 つは、「TryParse」が、「Parse」の周囲に Try Catch を配置するよりもパフォーマンスが優れているとは限らないことです。

それはあなたの失敗率に依存します。Try-Catch はパフォーマンスに影響を与えますが、ほとんどの影響は失敗したときです。ただし、成功率が 95% またはそれ以上で、パフォーマンスが考慮される場合は、ループを try-catch でラップすることを検討して、「try」ステートメントがあるときにのみヒットするようにすることをお勧めします。失敗。

int i = 0;
List<String> prePopulated;
List<DateTime> toPopulate;

while(i < prepopulated.Length)
{
   Try
   {
      while(i < prepopulated.Length)
      {
         List<DateTime>.add(DateTime.Parse(prePopulated[i]));
         i++;
      }
   }
   Catch(Exception ex)
   {
      //log if necessary
      i++;
   }
}

そのソリューションは、データが主にクリーンでパフォーマンスが重要な場合にのみ優れていることに注意してください。それ以外の場合は、「TryParse」というより単純な 1 行のほうが優れています。

于 2009-02-10T14:27:32.267 に答える
0

DateTime.TryParseに同意します。私は非常に大量のサイトで作業していますが、UIで例外をキャッチすることは許可されていません。これは、バグの防止に役立ちます。呼び出しているコードが例外をスローできないようにするために、私たちは本当に一生懸命努力しています。

于 2009-02-10T08:36:51.477 に答える