этот код выводы "оценивает".
class P
{
public static void Main()
{
string arg = null;
try
{
Method(out arg);
}
catch
{
}
Console.WriteLine(arg);
}
public static void Method(out string arg)
{
arg = "out value";
throw new Exception();
}
}
но этот не делает.
class P
{
public static void Main()
{
object[] args = new object[1];
MethodInfo mi = typeof(P).GetMethod("Method");
try
{
mi.Invoke(null, args);
}
catch
{
}
Console.WriteLine(args[0]);
}
public static void Method(out string arg)
{
arg = "out value";
throw new Exception();
}
}
как я могу добраться и, "оценивают" и исключение при использовании отражения?
Как насчет использования альтернативного контента для клиентов инвалидов JS (поисковые системы)? Я думаю, что нет другого способа позволить поисковым системам надевать свой сайт Ajax.
-121--5044767-Исключение обойдено кода в MOSTINFO.INVOKE (), которое копирует значение [OUT] из рамы стека обратно в массив объекта. Значение на кадре стека, которая вызывает () создает, ведет себя так же, как он делает в вашем 1-м фрагменте. Но вот где конец сходства.
Единственный способ - это перегрузка вашего метода таким образом, что учитывает возможность исключения, а затем пройти один в «на всякий случай». Следующее производит то, что я думаю, вы ищете. Проблема, насколько я понимаю, это то, что отражение не выполняет прямые манипулирование адресам, переданным ссылкой. Адреса не затрагиваются до тех пор, пока не будет достигнут без исключения метода. Возможно защита памяти или схема безопасности памяти от MS.
class P
{
public static void Main()
{
object[] args = { "1", new Exception()};
MethodInfo mi = typeof(P).GetMethod("Method");
try
{
mi.Invoke(null, args);
}
catch
{
}
Console.WriteLine(args[0].ToString());
Console.WriteLine(args[1].ToString());
}
public static void Method(ref string arg, ref Exception ex)
{
try
{
arg = "out value";
throw new Exception();
}
catch (Exception exc)
{
ex = exc;
}
}
}
Если проблема заключается в том, как произошло, как произошло исключение, и вы работаете с приложением Windows Forms, вы попытались смотреть на событие исключения Thread Exception и сочетать его с помощью SetUnhandledExceptionMode ()?
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
HandleException(e.Exception);
}
Параметр OUT не определен, если метод бросает исключение. Вы можете увидеть это, не инициализируя его на NULL в первом примере, то код не скомпировался.
Итак, имеет смысл для метода вызывания не возвращать неопределенное значение, если метод бросает исключение.
Я бы предложил изменить способ возврата объекта результата вместо параметра OUT. Объект результата может содержать исключение, а также значение вашего ARG.