2011-02-09 12 views

答えて

82

より良いからは非常に主観的である

。たとえば、私は個人的にはint.TryParseを好んでいます。なぜなら、ほとんどの場合気にしないからです。なぜなぜなら、失敗すると解析が失敗します。しかし、(documentationに従って)int.Parseできる3つの異なる例外がスロー:入力は、入力が有効なフォーマット

  • 入力されていない
  • ヌルである

    • オーバーフローをprocudes番号が含ま

    なぜ失敗するのか気になる場合は、int.Parseが明らかに良い選択です。

    いつものように、文脈はキングです。

  • +1

    私は、文脈が主張する一般的な推測に同意しますが、私はTryParseが*ほとんど常に*良いと言いたいと思います。それは非常に主観的な個人的な好みより少しだけです。あなたの反例(投げられる可能性のある異なる例外を区別する)はかなり珍しく、おそらくキャッチオールではなく例外タイプごとにキャッチブロックでコード化されているほうがよいでしょう。 – Joe

    +1

    @Joe:はい、異なる例外タイプを区別したい場合は、特定のcatchブロック以外のものは非常に奇妙に見えます。私の答えは、質問の特定のコードサンプルではなく、 'Parse'と' TryParse'を議論することを目的としていました。私がコメントの中のどこかで言及したように、 'TryParse'は*ほとんど常に*良い方法ですが、キーワードは「ほとんど」ではなく「常に」です。 –

    +0

    @ジョー:私はすでにその議論をしました。元の質問へのコメント交換を参照してください。絶対的なステートメントについてのフレドリックの権利は決して真実ではありません。 (OMGのパラドックス!) –

    10

    最初。 2番目のコードは例外によってとみなされます。

    8

    個人的に、私が好む:

    if (int.TryParse(string, out num)) 
    { 
        ... 
    } 
    
    4

    最初に!あなたは例外によってコード化するべきではありません。

    あなたは、これまでで、

    if (int.TryParse(string, out num))

    3

    まずそれを短縮することができます。 George氏が述べたように、2番目は例外によるコーディングであり、パフォーマンスに大きな影響を与えます。パフォーマンスは常に懸念事項になるはずです。

    2

    例外をキャッチするとオーバーヘッドが増えますので、TryParseに行きます。

    さらに、TryParseメソッドは、変換が失敗した場合でも例外をスローしません。これは、sが無効で正常に解析できない場合に、例外処理を使用してFormatExceptionをテストする必要性を排除します。最後の部分のコピー&ペーストhere

    37

    は、それは時々失敗する変換のための例外ですか、それは変換が時々失敗することが期待と通常のですか?前者の場合は、例外を使用してください。後者の場合、は例外を避けます。例外は、理由のために「例外」と呼ばれます。あなたは例外的に状況を処理するためにそれらを使用する必要があります。

    +1

    私はこの説明が好きです。なぜなら、多くのユーザーデータを解析して、失敗が予想されるかどうか(そして何が起こるか)はプロジェクト全体を形作るかどうかということです。 – JYelton

    +0

    エリック、私はあなたの考えをhttp://www.boost.org/community/error_handling.htmlで聞いてみたいと思うでしょう: "" 'これは例外的な(または予想外の)状況ですか?"このガイドラインには魅力的なリングがありますそれは通常は間違いです...もっと適切な質問は、「ここでスタックを巻き戻したいのですか?」「 – Jon

    +0

    @Jon:いくつかのことが思い浮かびます。第一に、例外の振る舞いを望むような状況では例外が正しいと言いますが、そこから何も学ぶことはできません。第二に、「例外的」と「予期しない」は2つの異なることです。そして第三に、スタック・アンワインディングはそれと何か関係があると誰が言いますか?これはC#の実装の詳細です。非同期メソッドでスローされた例外はスタックを解放しません。スタックは長くなくなっています。例外的なイベントが発生したことを通知します。セマンティクスを実装と混同しないでください。 –

    1

    その他の点では、例外はVisual Studioのデバッグ/出力ウィンドウに(オプションで)記録されることに注意してください。例外のパフォーマンスオーバーヘッドが重要ではない場合でも、デバッグ時に各例外のテキスト行を記述すると、処理が遅れることがあります。失敗した整数構文解析操作のすべてのノイズの中で、さらに注目すべき例外が溺れている可能性があります。

    15

    実際の変換は時々このように、私はconditional (Ternary) operatorと一行にきちんとint.TryParseなどを使用するように、失敗することが予想される場合:ゼロとして使用される。この場合

    int myInt = int.TryParse(myString, out myInt) ? myInt : 0; 
    

    TryParseメソッドが失敗した場合のデフォルト値。

    変換が失敗した場合は、デフォルト値をnullで上書きします。

    +0

    これは、以下のものとまったく同じです: 'int myInt; int.TryParse(myString、out myInt); '。 TryParse()はすでに失敗した場合に結果を0に設定します。 –

    +3

    正解ですが、私のバージョンでは、 '10'のような*代替*デフォルト値を指定することができます。 – greg84

    関連する問題