Как передать значение/касательно параметр из метода, который выдает исключение?

этот код выводы "оценивает".

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();
  }
}

как я могу добраться и, "оценивают" и исключение при использовании отражения?

12
задан Mehrdad Afshari 20 January 2010 в 11:31
поделиться

5 ответов

Как насчет использования альтернативного контента для клиентов инвалидов JS (поисковые системы)? Я думаю, что нет другого способа позволить поисковым системам надевать свой сайт Ajax.

-121--5044767-

Исключение обойдено кода в MOSTINFO.INVOKE (), которое копирует значение [OUT] из рамы стека обратно в массив объекта. Значение на кадре стека, которая вызывает () создает, ведет себя так же, как он делает в вашем 1-м фрагменте. Но вот где конец сходства.

1
ответ дан 3 December 2019 в 00:08
поделиться

Единственный способ - это перегрузка вашего метода таким образом, что учитывает возможность исключения, а затем пройти один в «на всякий случай». Следующее производит то, что я думаю, вы ищете. Проблема, насколько я понимаю, это то, что отражение не выполняет прямые манипулирование адресам, переданным ссылкой. Адреса не затрагиваются до тех пор, пока не будет достигнут без исключения метода. Возможно защита памяти или схема безопасности памяти от 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;
            }
        }
}
1
ответ дан 3 December 2019 в 00:08
поделиться

Если проблема заключается в том, как произошло, как произошло исключение, и вы работаете с приложением 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);        
}
0
ответ дан 3 December 2019 в 00:08
поделиться

Параметр OUT не определен, если метод бросает исключение. Вы можете увидеть это, не инициализируя его на NULL в первом примере, то код не скомпировался.

Итак, имеет смысл для метода вызывания не возвращать неопределенное значение, если метод бросает исключение.

-1
ответ дан 3 December 2019 в 00:08
поделиться

Я бы предложил изменить способ возврата объекта результата вместо параметра OUT. Объект результата может содержать исключение, а также значение вашего ARG.

0
ответ дан 3 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: