2013-09-12 3 views
1

Мы обработка ошибок вокруг нашего Windows Mobile приложения похоже на следующее:Windows Mobile Application избежать Необработанной обработки исключений

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [MTAThread] 
    static void Main() 
    { 
     try 
     { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); 
      LogWriter.WriteDebugLog("******* Application Start *******"); 
      Application.Run(new Form1()); 
     } 
     catch (Exception ex) 
     { 
      LogWriter.WriteDebugLog("LOG MAIN: " + ex.Message + "\r\nTrace: " + ex.StackTrace); 
      MessageBox.Show("An unexpected error has occured, please try again. If the problem continues please contact application provider.", "Fatal Error"); 
     } 
     finally 
     { 
      AppDomain.CurrentDomain.UnhandledException -= new UnhandledExceptionEventHandler(OnUnhandledException); 
      try 
      { 
       //System.Diagnostics.Process proc = System.Diagnostics.Process.GetCurrentProcess(); 
       //proc.Kill(); 
      } 
      catch { } 
      LogWriter.WriteDebugLog("******* Application Exit *******"); 
     } 
    } 

    public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     string application_name = sender.ToString(); 
     Exception except = (Exception)e.ExceptionObject; 
     string errormessage = "Application " + application_name + " [ Exception " + except.Message + " ]" + Environment.NewLine + except.StackTrace; 

     //MessageBox.Show(errormessage, "Fatal Error"); 
     LogWriter.WriteDebugLog(errormessage); 
     AppDomain.CurrentDomain.UnhandledException -= new UnhandledExceptionEventHandler(OnUnhandledException); 
    } 
} 

Несмотря на эту методологию обработки ошибок, которые мы получили журналы от пользователей, где приложение просто прекращаются без запись выхода или необработанное исключение или исключение LOG MAIN.

Я пытался воспроизвести это, создав очень простое приложение и бросив вокруг себя различные стратегии исключения, чтобы убить приложение, но без успеха. Каждый раз, когда я бросаю какое-либо исключение, он, похоже, попадает в код выше.

Если у кого-то есть идеи относительно того, какие проблемы могут пропустить эту обработку ошибок, было бы весьма полезно, так как это могло бы продвинуть наши исследования вперед.

С уважением, Грэм.


Редактировать: Немного больше информации, если оно имеет отношение к запросу.

В рассматриваемых приложениях большое количество приложений для Windows Mobile 6.5, в основном работающих на устройствах Motorola MC65, хотя некоторые из них находятся на устройствах Psion EP10, а некоторые - на других устройствах (так что это вряд ли будет специфичным для устройства).

Все приложения используют SQLCe и Merge Replication. Многие из них используют сторонние элементы управления для отображения в формах. Все они используют определенное количество PInvoking для различных целей.

Сбой сам по себе не происходит в какой-либо конкретной точке приложения и не очень часто даже тогда, но когда мы просматриваем журналы, мы видим, что приложение регистрирует его прогресс (включая использование памяти и различные другие полезные сведения) и то он просто заканчивается без записи.

+0

Некоторые исключения не могут быть пойманы таким образом. Включая исключения, поднятые до запуска Main(), тип исключения, для которого был назван этот веб-сайт, и исключения из неуправляемого кода, не запущенного CLR. Документируйте, что вы * знаете * об этих авариях, поэтому нам не нужно угадывать или писать книгу об этом. –

ответ

0

Вы также должны поймать необработанное исключение темы аналогичным образом:

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 


    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); 
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

    Application.Run(new Form1()); 
} 

Ref .: Application.ThreadException

+0

Они уже обрабатываются по умолчанию, что не создает запись в журнале. –

+1

Winforms просто уже предоставляет обработчик по умолчанию для Application.ThreadException. Он отображает ThreadExceptionDialog. Наиболее актуальным для этого вопроса является то, что .NET CF вообще не имеет события. –

+0

уверен, но он не будет регистрировать ничего в файле журнала плакатов. Хороший вопрос об исключаемых исключениях. http://stackoverflow.com/questions/2014562/whats-the-difference-between-application-threadexception-and-appdomain-currentd –

1

«Несмотря на этой обработке ошибок методологии, которые мы получили журналы от пользователей, где приложение просто завершено без записи выхода или необработанного исключения или исключения ОСНОВНОГО РЕЖИМА. "

Существуют исключения, которые не обрабатываются обработчиком .NET excption: например, собственный код, на который ссылается ваша функция использования приложения, может произойти сбой.

Возможно, у вас есть более простая проблема: если ресурсы устройства становятся низкими, он отправляет сообщение спящего режима (http://msdn.microsoft.com/en-us/library/aa925791.aspx) во все окна. Если процесс не освобождает ресурсы и не отвечает на этот запрос, он может быть просто убит ОС, если ресурсы остаются низкими после трансляции.

У меня уже были некоторые призывы к поддержке (я выполняю поддержку WM/PPC в течение 9 лет), и они были исправлены, уменьшив использование ресурсов на устройствах и внедряя обработчик WM_HIBERNATE.

+0

Существует явная вероятность того, что ошибка возникает в собственном коде. К сожалению, характер проблемы не позволяет мне подтвердить или опровергнуть это, поскольку это может произойти в любой момент жизненного цикла приложения. Я надеялся найти способ поймать такие проблемы, чтобы я мог хотя бы увидеть, что в первую очередь вызвало ошибку – user2773054

+0

, если вы используете p/invoke, а затем записывайте каждый вызов этих функций p/invoke. Проблема также может быть вызвана стандартной lib, поэтому включите отчет об ошибках или дампы: http://blogs.msdn.com/b/hopperx/archive/2005/10/07/getting-help-from-the-doctor- др-уотсон-что-is.aspx. Вы также должны периодически регистрировать состояние памяти и ресурсов, чтобы убедиться, что нет причины, по которой приложение будет убито ОС (или реализовать обработчик wm_hibernate). – josef

+0

+1 для josef. У вас есть простой отредактированный фрагмент кода, показывающий, как слушать сообщения 'WM_HIBERNATE'? Я никогда не нашел хороший способ реализовать это в 'WinMobile' ... я бы * хотел *, хотя. – jp2code

0

@Mitch Wheat Я считаю, что мы говорим здесь о Windows Mobile 6, который использует .NET CF 3.5 .NET CF не поддерживает ThreadException, поэтому вы не можете этого сделать.

Смежные вопросы