На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Control.Invoke и исключения
    Здаствуйте, есть 2 проблемы с виндовыми контролами и исключениями генерируемых в них через метод Invoke

    вот пример:

    ExpandedWrap disabled
              private void Form1_Load (object sender, EventArgs e)
              {
                  new Thread (delegate ()
                      {
                          try
                          {
                              this.Invoke (new MethodInvoker (delegate ()
                              {
                                  try
                                  {
                                      throw null;
                                  }
                                  catch (Exception ex)
                                  {
                                      throw new MyException (ex);
                                  }
                              }));
                          }
                          catch (Exception ex)
                          {
                              MessageBox.Show (ex.GetType ().FullName);
                          }
                      }).Start ();
              }
       
              public class MyException : Exception
              {
                  public MyException (Exception innerException)
                      : base ("", innerException)
                  {
       
                  }
              }


    1 вопрос:

    MessageBox, утверждает, что сгенерировалось исключение NullReferencException, хотя я его перехватил, и обернул в своё исключение, которое потом и вызвал. Возникает вопрос, зачем при окончание метода Inkove, контрол спускается на самое нижнее исключение по InnerException, и вызывает его? И как собственно обойти это счатье, мне нужно перехватывать именно свои исключения.

    Сделал так

    ExpandedWrap disabled
      public class MyException : Exception
              {
                  public readonly new Exception InnerException;
       
                  public MyException (Exception innerException)
                      : base ("", null)
                  {
                      this.InnerException = innerException;
                  }
              }


    Но это выглядит порнографией, есть ли нормальный способ?

    2 вопрос:

    Рылся в тулсах, в отладке, но нинашел никаких настроек отключения этого счасться:

    В режиме дебага, отладчик постоянно останавливается на генерации исклюения, которые в методе Invoke не перехватывается, как это отключить? И в первом примере и тут, отладчик останавливается на строке "throw null;"

    Тоже самое и в консоли:


    ExpandedWrap disabled
          internal static class Program
          {
              private static void Main ()
              {
                  ThreadStart method = new ThreadStart (delegate ()
                      {
                          throw null;
                      });
       
                  method.BeginInvoke (delegate (IAsyncResult ar)
                  {
                      try
                      {
                          method.EndInvoke (ar);
                      }
                      catch(Exception ex)
                      {
                          Console.WriteLine (ex.Message);
                      }
                  }, null);
       
                  Console.ReadKey ();
              }
          }


    Зарание спасибо.
      TerraGhost, когда ты зовешь this.Invoke, ты вызываешь исключение не в твоем созданном потоке, а в потоке UI, и естественно оно не обрабатывается. Посмотри, я писал в FAQ об этом.
      Вот так его можно поймать:

      ExpandedWrap disabled
        Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
        void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
                {
                    MessageBox.Show(e.Exception.GetType().FullName);
                }
        Цитата TerraGhost @
        MessageBox, утверждает, что сгенерировалось исключение NullReferencException
        - все верно, напиши вместо throw null; - throw new Exception(); и подумай почему все поменялось ;)

        PS
        интернет пропадал
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0190 ]   [ 15 queries used ]   [ Generated: 17.05.24, 03:33 GMT ]