In .:
[mono.git] / mcs / class / corlib / System / Exception.cs
index 76f906d6c2ff16c1effd143a33cd7a8c4eac38bd..f76c8ff4a5b6ad22a62164e730fd18077f978949 100644 (file)
@@ -40,33 +40,42 @@ using System.Security.Permissions;
 namespace System
 {
        [Serializable]
+#if NET_2_0
+       [ComVisible(true)]
+       [ComDefaultInterface (typeof (_Exception))]
+       [ClassInterface (ClassInterfaceType.None)]
+#else
        [ClassInterface (ClassInterfaceType.AutoDual)]
+#endif
        public class Exception : ISerializable 
 #if NET_2_0
        , _Exception
 #endif
        {
+               #region Sync with object-internals.h
                IntPtr [] trace_ips;
                Exception inner_exception;
-               string message;
+               internal string message;
                string help_link;
                string class_name;
                string stack_trace;
                string remote_stack_trace;
                int remote_stack_index;
-               int hresult = unchecked ((int)0x80004005);
+               internal int hresult = unchecked ((int)0x80004005);
                string source;
+               private IDictionary _data;
+               #endregion
 
                public Exception ()
                {
                }
 
-               public Exception (string msg)
+               public Exception (string message)
                {
-                       message = msg;
+                       this.message = message;
                }
 
-               protected Exception (SerializationInfo info, StreamingContext sc)
+               protected Exception (SerializationInfo info, StreamingContext context)
                {
                        if (info == null)
                                throw new ArgumentNullException ("info");
@@ -82,10 +91,10 @@ namespace System
                        inner_exception     = (Exception) info.GetValue ("InnerException", typeof (Exception));
                }
 
-               public Exception (string msg, Exception e)
+               public Exception (string message, Exception innerException)
                {
-                       inner_exception = e;
-                       message = msg;
+                       inner_exception = innerException;
+                       this.message = message;
                }
 
                public Exception InnerException {
@@ -115,7 +124,12 @@ namespace System
                public virtual string Message {
                        get {
                                if (message == null)
-                                       message = string.Format (Locale.GetText ("Exception of type {0} was thrown."), GetType ().ToString());
+#if NET_2_0
+                                       message = string.Format (Locale.GetText ("Exception of type '{0}' was thrown."),
+#else
+                                       message = string.Format (Locale.GetText ("Exception of type {0} was thrown."),
+#endif
+                                               GetType ().ToString());
 
                                return message;
                        }
@@ -139,7 +153,7 @@ namespace System
                                        }
                                }
 
-                                // source can be null
+                               // source can be null
                                return source;
                        }
 
@@ -159,13 +173,13 @@ namespace System
 
                                        StringBuilder sb = new StringBuilder ();
 
-                                       string newline = String.Format ("{0}{1} ", Environment.NewLine, Locale.GetText ("in"));
+                                       string newline = String.Format ("{0}  {1} ", Environment.NewLine, Locale.GetText ("at"));
                                        string unknown = Locale.GetText ("<unknown method>");
 
                                        for (int i = 0; i < st.FrameCount; i++) {
                                                StackFrame frame = st.GetFrame (i);
                                                if (i == 0)
-                                                       sb.AppendFormat ("{0} ", Locale.GetText ("in"));
+                                                       sb.AppendFormat ("  {0} ", Locale.GetText ("at"));
                                                else
                                                        sb.Append (newline);
 
@@ -176,16 +190,17 @@ namespace System
                                                        else
                                                                sb.AppendFormat ("<0x{0:x5}> {1}", frame.GetNativeOffset (), unknown);
                                                } else {
+                                                       GetFullNameForStackTrace (sb, frame.GetMethod ());
+
                                                        if (frame.GetILOffset () == -1)
-                                                               sb.AppendFormat ("<0x{0:x5}> ", frame.GetNativeOffset ());
+                                                               sb.AppendFormat (" <0x{0:x5}> ", frame.GetNativeOffset ());
                                                        else
-                                                               sb.AppendFormat ("[0x{0:x5}] ", frame.GetILOffset ());
+                                                               sb.AppendFormat (" [0x{0:x5}] ", frame.GetILOffset ());
+
                                                        string fileName = frame.GetFileName ();
                                                        if (fileName != null)
-                                                               sb.AppendFormat ("(at {0}:{1}) ", fileName, frame.GetFileLineNumber ());
-
-                                                       sb.Append (GetFullNameForStackTrace (frame.GetMethod ()));
-                                               }
+                                                               sb.AppendFormat ("in {0}:{1} ", fileName, frame.GetFileLineNumber ());
+                                                       }
                                        }
                                        stack_trace = sb.ToString ();
                                }
@@ -208,8 +223,6 @@ namespace System
                }
 
 #if NET_2_0
-               private IDictionary _data;
-
                public virtual IDictionary Data {
                        get {
                                if (_data == null) {
@@ -274,8 +287,8 @@ namespace System
                        if (inner_exception != null) 
                        {
                                result.Append (" ---> ").Append (inner_exception.ToString ());
-                               result.Append (Locale.GetText ("--- End of inner exception stack trace ---"));
                                result.Append (Environment.NewLine);
+                               result.Append (Locale.GetText ("  --- End of inner exception stack trace ---"));
                        }
 
                        if (StackTrace != null)
@@ -298,35 +311,54 @@ namespace System
                        return this;
                }
 
-               internal string GetFullNameForStackTrace (MethodBase mi)
+               internal void GetFullNameForStackTrace (StringBuilder sb, MethodBase mi)
                {
-                       string parms = "";
                        ParameterInfo[] p = mi.GetParameters ();
-                       for (int i = 0; i < p.Length; ++i) {
-                               if (i > 0)
-                                       parms = parms + ", ";
-                               string paramName = (p [i].Name == null) ? "" : (" " + p [i].Name);
-                               Type pt = p[i].ParameterType;
-                               if (pt.IsClass && pt.Namespace != "")
-                                       parms = parms + pt.Namespace + "." + pt.Name + paramName;
-                               else
-                                       parms = parms + pt.Name + paramName;
-                       }
+                       sb.Append (mi.DeclaringType.ToString ());
+                       sb.Append (".");
+                       sb.Append (mi.Name);
 
-                       string generic = "";
 #if NET_2_0 || BOOTSTRAP_NET_2_0
-                       if (mi.HasGenericParameters) {
+                       if (mi.IsGenericMethod) {
                                Type[] gen_params = mi.GetGenericArguments ();
-                               generic = "[";
+                               sb.Append ("[");
                                for (int j = 0; j < gen_params.Length; j++) {
                                        if (j > 0)
-                                               generic += ",";
-                                       generic += gen_params [j].Name;
+                                               sb.Append (",");
+                                       sb.Append (gen_params [j].Name);
+                               }
+                               sb.Append ("]");
+                       }
+#endif
+                       sb.Append (" (");
+                       for (int i = 0; i < p.Length; ++i) {
+                               if (i > 0)
+                                       sb.Append (", ");
+                               Type pt = p[i].ParameterType;
+                               if (pt.IsClass && pt.Namespace != String.Empty) {
+                                       sb.Append (pt.Namespace);
+                                       sb.Append (".");
+                               }
+                               sb.Append (pt.Name);
+                               if (p [i].Name != null) {
+                                       sb.Append (" ");
+                                       sb.Append (p [i].Name);
                                }
-                               generic += "]";
                        }
+                       sb.Append (")");
+               }
+
+#if NET_2_0
+               //
+               // The documentation states that this is available in 1.x,
+               // but it was not available (MemberRefing this would fail)
+               // and it states the signature is `override sealed', but the
+               // correct value is `newslot' 
+               //
+               public new Type GetType ()
+               {
+                       return base.GetType ();
+               }
 #endif
-                       return mi.DeclaringType.ToString () + ":" + mi.Name + generic + " (" + parms + ")";
-               }                               
        }
 }