Author: bgarret
Date: Sun Feb 17 15:51:44 2008
New Revision: 150
URL: http://svn.gnome.org/viewvc/hipo?rev=150&view=rev

Log:
2008-02-17  Benoit Garret  <[EMAIL PROTECTED]>

        * src/HipoMain.cs: catch glib exceptions



Modified:
   trunk/ChangeLog
   trunk/src/HipoMain.cs

Modified: trunk/src/HipoMain.cs
==============================================================================
--- trunk/src/HipoMain.cs       (original)
+++ trunk/src/HipoMain.cs       Sun Feb 17 15:51:44 2008
@@ -3,6 +3,7 @@
 using Mono.Unix;
 using Gtk;
 using Glade;
+using GLib;
 
 namespace Hipo
 {
@@ -22,27 +23,60 @@
                
                public void Run (string[] args)
                {
-                       AppDomain.CurrentDomain.UnhandledException += 
UnhandledExceptionHandler;
+                       AppDomain.CurrentDomain.UnhandledException += 
AppUnhandledExceptionHandler;
+                       GLib.ExceptionManager.UnhandledException += 
GlibUnhandledExceptionHandler;
                        
                        HipoMainWindow hmw = new HipoMainWindow ();
                        hmw.CreateWindow (args);
                }
                
-               public void UnhandledExceptionHandler (object o, 
UnhandledExceptionEventArgs args)
+               public void AppUnhandledExceptionHandler (object o, 
UnhandledExceptionEventArgs args)
                {
-                       Glade.XML gxml = new Glade.XML ("errordialog.glade", 
"errorDialog");
-                       
-                       stackTrace = (TextView)gxml.GetWidget ("stackTrace");
-                       message = (Label)gxml.GetWidget ("message");
-                       errorDialog = (Dialog)gxml.GetWidget ("errorDialog");   
                        
+                       UnhandledExceptionHandler 
((Exception)args.ExceptionObject);
+               }
+               
+               public void GlibUnhandledExceptionHandler 
(GLib.UnhandledExceptionArgs args)
+               {
+                       UnhandledExceptionHandler 
((Exception)args.ExceptionObject);
+               }
+               
+               public void UnhandledExceptionHandler (Exception e)
+               {
+                       string stack = GetStackTrace (e);
+                       string msg = GetMessage (e);
                        
-                       Exception e = (Exception) args.ExceptionObject;
+                       Gtk.Application.Invoke (delegate {
+                               
+                               Glade.XML gxml = new Glade.XML 
("errordialog.glade", "errorDialog");
+                               
+                               stackTrace = (TextView)gxml.GetWidget 
("stackTrace");
+                               message = (Label)gxml.GetWidget ("message");
+                               errorDialog = (Dialog)gxml.GetWidget 
("errorDialog");                           
+                               
+                               stackTrace.Buffer.Text = stack;
+                               message.Text = msg;
+                               errorDialog.Run ();
+                               
+                               errorDialog.Destroy ();
+                       });
                        
-                       stackTrace.Buffer.Text = e.StackTrace;
-                       message.Text = e.Message;
-                       errorDialog.Run ();
+                       Application.RunIteration ();
                }
                
+               public string GetMessage (Exception e)
+               {
+                       if (e.InnerException != null)
+                               return String.Concat (e.Message, " : ", 
GetMessage (e.InnerException));
+                       else
+                               return e.Message;
+               }
                
+               public string GetStackTrace (Exception e)
+               {
+                       if (e.InnerException != null)
+                               return String.Concat (GetStackTrace 
(e.InnerException), "\n::End of inner stack trace::\n", e.StackTrace);
+                       else
+                               return e.StackTrace;
+               }
        }
 }
_______________________________________________
SVN-commits-list mailing list (read only)
http://mail.gnome.org/mailman/listinfo/svn-commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit 
your options and select the modules ('topics') you want.
Module maintainer? It is possible to set the reply-to to your development 
mailing list. Email [EMAIL PROTECTED] if interested.

Reply via email to