2012-03-09 20 views
3

私がしばらく考えてきたことだけです。例外の処理は、それぞれの例外を捕らえる必要がありますか?

try 
{ 
    //Code goes here 
} 
catch(Exception ex) 
{ 
} 

かの操作を行います。私はこのようにそれをしなければならない

try 
{ 
    //Code goes here 
} 
catch 
{ 
} 

かの操作を行います。私は、その特定の例外をキャッチすることにより、KeyNotFoundExceptionを処理する必要はありますか私はちょうどこのような「空白」のキャッチを使用することができます私が尋ねる理由は、私はアプリのハブでクラッシュ回数を見ると、私は「KeyNotFoundException」に関連するクラッシュの多くを持っているということです

try 
{ 
    //Code goes here 
} 
catch(KeyNotFoundException ex) 
{ 
} 

が、私は私の中に任意のクラッシュを経験したことがない:私はこのようにそれをしなければなりませんa pp。これは問題である可能性があります。具体的な例外は検出されず、例外が処理されてもアプリケーションハブのクラッシュ統計がクラッシュとして分類されますか?

EDIT: App Hubクラッシュ統計(スタックトレース)のスクリーンショットです。誰かが細部を細かく知っていますか?それは私のバックグラウンドエージェントと関係しているとそれは私が私のアプリに任意のクラッシュを経験したことがない理由の理由かもしれません:

enter image description here

enter image description here

enter image description here

+0

例外がスローされる理由を理解する必要があります。インデクサの代わりに 'TryGetValue'がこの例外を回避します。根本的な問題はマルチスレッドである可能性もあります。この場合、正しい同期を追加することが正しい解決策です。 – CodesInChaos

答えて

2

あなたは、ベースの例外を使用することができます後者が前者を継承するので、ExceptionKeyNotFoundExceptionをキャッチします。厳密に言えば、「任意の」例外をキャッチする場合は、catch (Exception)で十分です。

ただし、意味のある方法で処理できるのであれば例外をキャッチする必要があります。私はこの考え方がどのようにWP開発に対して積み上げているのかよく分かりませんが。

根本的な問題については、わかりません。 App Hubは、スタックトレースなどのクラッシュに関する詳細を提供していませんか?

未処理の例外イベントを登録する場所にテンプレートコードを残し、クラッシュ時にアプリケーションの状態についてできるだけ詳しく記録するためにアプリケーションにいくつかのログを記録することをお勧めします。

+0

よろしくお願いします。上の最初の例は間違っているので、catch(Exception Ex)を指定する必要がありますか? – John

+0

@ジョン:はい、正しいです。 – Treb

+0

@ジョン - いいえ、あなたはしません。最初の例は問題ありません。 – ColinE

1

いいえ、try/catchブロックでそれぞれの特定の例外タイプをキャッチする必要はありません。C# language referenceを参照してください。

しかし、すべてのコードをtry/catchブロックでラップするのではなく、例外処理ロジックを追加してApplication.UnhandledExceptionイベントのハンドラにログすることをお勧めします。このイベントの処理方法の例については、this excellent blog postを参照してください。

+0

ありがとう、それから私は私がApp Hubで多くのクラッシュを起こしている理由を理解する必要があります:http://i44.tinypic.com/auv4tu.jpg私のOnInvoke関数がこれを引き起こしているように見えます。 – John

1

あなたは、コードの特定の部分でKeyNotFoundExceptionとして、特定の例外に興味がなされている場合は、特定の例外とあなたは、いくつかの未定義のものをキャッチしたいなら、あなたはこの

try 
{ 
    //Code goes here 
} 
catch(KeyNotFoundException ex) 
{ 

} 

のようにそれをキャッチあなたのアプリケーションは、アプリケーションで使用コリンの例をクラッシュしていないことを確認したい場合は、この

try 
{ 
    //Code goes here 
} 
catch(KeyNotFoundException ex) 
{ 

} 
catch(Exception ex) 
{ 

} 

のようなもの。UnhandledExceptionイベントです。

+0

クール、これをクリアしていただきありがとうございます! – John

1

基本クラスをキャッチしてすべての例外をキャッチすることはできますが、達成しようとしていることに依存したいかどうかを判断できます。

一般的に言えば、エラーについて何をすべきかを判断する、つまり何らかのアクションをロールバックする、またはメッセージを表示する知識があるレベルで例外をキャッチするだけです。特定のレベルでは、特定の例外タイプを検出するのが理にかなっていることがよくあります。そのレベルのコードは、その意味を理解していますが、すべてをキャッチするのは意味がないかもしれません。

あなたは間違ったことを伝えるために例外が存在しますが、ブランケットキャッチはそれを無視し、プログラムの実行を継続して間違った動作をし、データを破壊する可能性があります。予期しない例外が発生した場合、「早期失敗して失敗する」方が良い場合があります。

+0

@ Foo42、そうだね。私はアプリケーションをより良くするために特定のエラーを処理しようとします。クラッシュの統計を見るのは本当にイライラしていますが、アプリを使ってクラッシュすることはありません。 – John

3

いいえ、マーケットプレイスは未処理の例外のみをカウントしているため、アプリがクラッシュします。

空のキャッチまたはキャッチ例外は最も一般的なキャッチです(すべての例外は例外の基本クラスから派生しているため、すべてをキャッチしています)。重要なコードはtry-catchを使用しない場所です。例外に基づいて、あなたの辞書をチェックし、誤りを引き起こす可能性のある条件について考えなければなりません。物事がうまくいかない場合は、このケースで

public User GetUser(string username) 
{ 
    if (String.IsNullOrEmpty(username)) 
     throw ArgumentNullException("username"); 
    return this.users[username]; 
} 

は、一般的に良い練習は、何らかの問題が発生した場合は、自分でより有用なエラーメッセージを提供することができますので、例えば、あなたのパブリックメソッドのパラメータの正しさを確認することですユーザー名にnullを使用したことがわかります。そうしないと、KeyNotFoundExceptionが表示されます。これは、幸運を助けることを望む!

+0

ありがとう。私は決してクラッシュを経験していないので、バックグラウンドエージェントと関係があると思います。トレース時に、OnInvokeが表示されます。http://i44.tinypic.com/auv4tu.jpg – John

+0

バックグラウンドエージェントから既存の隔離されていないストレージ設定エントリにアクセスしようとしているというスタックトレース。おそらく、アプリケーションを再インストールした後、バグを再現することができます。 –

1

他の人が言ったように - が必要です特定の例外をキャッチするには、例外をキャッチするかキャッチするだけで例外がバブリングしないようにします。

は、できる限りコードをより明示的にするために、特定の例外をキャッチする必要があります。潜在的なエラー状態の前にもう一度正しいかどうかテストしてください。もう一度これは他のポストでカバーされています。

あなたが投稿したリンクは、隔離されたストレージ(IsolatedStorage.get_Item)から値を読み取る際に問題があることを示しているようです - ScheduledTaskAgent呼び出し中にIsolatedStorageにアクセスすると、それを得る前に。おそらくいくつかの設定が欠落しているか何かがありますか?

+0

さて、リンクを見ていただきありがとうございます。だから、基本的に値を読むときにすべきでしょうか?私はいくつかの設定値を読み、私は今それらのいくつかはtry/catchを持っていないことがわかります。だから、基本的に私はキャッチパーツの特定の構成設定のデフォルト値を割り当て、この方法でうまくいくはずです。私は自分のコードを更新し、どのように動作するかを見ていきます。 – John

+0

例外をキャッチするのではなく、最初にチェックするためにTryGetValueまたはContainsKeyを使用する傾向があります。しかし、try/catchをもっと読みやすくしてから、そのようにすると、それは主に個人的な好みの問題です(この例では実際にはパフォーマンスの影響はありません) – dice

関連する問題