2016-04-05 35 views
10

.NETネイティブコンパイラを使用してUWPアプリケーションをコンパイルしてコードの最適化をオンにすると、実際の例外にアクセスしようとするとNullReferenceExceptionキャッチブロック除外された例外ハンドラのコードで例外が発生するとNullReferenceExceptionがスローされる

コードサンプル:

try 
{ 
    throw new ArgumentNullException("Param"); 
} 
catch (ArgumentNullException ex) when (ex.ParamName == "Param") 
{ 
    ErrorBlock.Text = ex.ParamName; // ErrorBlock is a TextBlock in the xaml 
} 
catch (Exception) 
{ 
} 

それは正しいcatchブロックに入り、私はexにアクセスしたときNullReferenceExceptionをスローします。 .Netネイティブコード最適化とコード最適化が両方ともオンの場合にのみ失敗します。

この問題の原因を教えてください。

+1

@ Panなぜタグを削除しますか?これはこのビルドモードに関係しているようで、おそらく.NETネイティブのコンパイラの問題です。 –

+0

彼らは無関係です。 'exc.Message'はnullです。これは単純なNulLReferenceExceptionです。オペレータがパラメータ名を受け付けるコンストラクタを呼び出す –

+3

いいえ、そうではありません。メッセージはデフォルトで設定されています。このコードを自分で試してください。 –

答えて

2

私は.NETネイティブランタイムとコンパイラチームで作業しています。

これは私たちのコンパイラのバグです。小さな関数または "funclet"として各例外処理領域(try、catch、finally、when)を考えることができます。 「いつ」(別名フィルタブロック)のスタックを設定するときに、例外オブジェクトの追跡が失われます。この不具合はWindows Tools 1.3で修正されました。重大な挫折がない限り、もう1〜2週間で出荷されるはずです。それは、VS 2015アップデート2をインストールした人々のためのアップデートとして表示されます。

他に質問がある場合はお知らせください。

+0

ありがとう@Matt!このシナリオでは、非同期、非同期、非待機、非同期+待機の3つのシナリオでわずかに異なる動作が見られました。アップデートが出たときに私は3つのショットをすべて与えるつもりです。 – FUR10N

+0

優れています。それがどうなるか教えてください。皆様からのご意見をお待ちしております([email protected])。 –

5

なぜそれが間違っているのかよくわからないのですが(今かなりの時間デバッグされていますが)、awaitの不足が私を不思議に思っていました。

あなたは、コードは問題なく動作しますShowAsync方法(明らかに、あなたはまだそれをしなかった場合の方法asyncを作成する必要があります)待つない場合:awaitせずにコードブロック間

await new MessageDialog("Argument null exception: " + argEx.Message).ShowAsync(); 

を失敗しました。これがバグか修正しなければならないものかどうかは分かりません...

+0

うーん、それも私のために働いた!私はそれがasync/awaitに関連していることを認識していませんでした。私がこれを見つけた実際のコードは、設計によって特定の結果を待っているわけではありません(とにかくICommandsにあるので、非同期の空白になります)。私はあなたがこれをとにかく待つ必要があるとは思わないと思いますよね? – FUR10N

+0

はい、すべての 'async'は' await'しなければなりません。 –

+0

これは長時間実行されるタスクであり、後で継続をスケジュールする必要はありません。私はここで火と忘れの行動をしたい。それを待っていることは本当にオプションではありません。 – FUR10N

関連する問題