Я создаю обертки для типов, используя System.Reflection.Emit
. В какой-то момент возможно, что исходный объект выкидывает ошибку при доступе ( FaultException
) и ошибка должна быть поймана моим try { } catch (Exception e) { }
, который я реализовал, но этого не происходит.
Код корректно отображается ILSpy.
try
{
if (original.Station != null)
{
if (objectDictionary.ContainsKey(original.Station))
{
this.Station = (objectDictionary[original.Station] as StationWrapper);
}
else
{
this.Station = new StationWrapper(original.Station, objectDictionary);
}
}
}
catch (Exception arg_6D_0)
{
ReportManager.Log(arg_6D_0);
}
Это код для ассемблерной генерации.
Label ex = il.BeginExceptionBlock();
....
// Exception block end
il.Emit(OpCodes.Leave, ex);
il.BeginCatchBlock(typeof(Exception));
il.Emit(OpCodes.Call, ReportManager_Log);
il.EndExceptionBlock();
Исключение перехватывается пользовательским кодом, но не IL-кодом.
Здесь удалены некоторые пространства имен клиента. Строка write была добавлена в последние минуты.
.try
{
IL_0019: ldarg.1
IL_001a: call instance class [...]...Station [...]...StationBase::get_Station()
IL_001f: brfalse IL_0063
IL_0024: ldarg.2
IL_0025: ldarg.1
IL_0026: call instance class [...]...Station [...]...StationBase::get_Station()
IL_002b: call instance bool class [mscorlib]System.Collections.Generic.Dictionary`2
При выбросе System.Exception
в IL-коде, прежде чем может произойти FaultException'1
, исключение обрабатывается. Проверено с Exception
и ArgumentException
.