変換を実行してその結果をプロパティに割り当てる式ツリーを生成するEffortライブラリのコードブロックにエラー処理を追加しようとしています。
既存のコードの問題は、値型のプロパティにnullを割り当てようとしたときに、実行時にこの式が呼び出されたときにNullReferenceExceptionがスローされることです。この場合、割り当てようとしたプロパティに関する情報がないため、より具体的な例外をスローしたいと思います。
以下は、このロジックをtry / catchブロックにカプセル化し、変換が失敗した場合に例外をスローする最初の試みです。最終的には、InvalidOperationExceptionにさらに情報を追加します。
blockElements.Add(
Expression.TryCatch(
Expression.Assign(
Expression.Property(result, this.Properties[i]),
Expression.Convert(
Expression.ArrayIndex(parameter, Expression.Constant(i)),
this.Properties[i].PropertyType)),
Expression.Catch(typeof(NullReferenceException),
Expression.Throw(Expression.Constant(
new InvalidOperationException("Unhandled exception"))))));
私の心の中でこれは私がやろうとしていることです:
try
{
Property = (int)value;
}
catch (NullReferenceException)
{
throw new InvalidOperationException("Unhandled exception");
}
ただし、実行時に、その式は「catchの本体はtryの本体と同じタイプである必要があります」というメッセージとともにArgumentExceptionをスローするようになりました。私はここで何が間違っているのですか?スローが原因でヒットすることはありませんが、ダミー値を「返す」ために、Catch式にブロックを作成する必要がありますか?
それとも私はこれに完全に間違った方法でアプローチしていますか?