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");
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 {
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;
}
}
}
- // source can be null
+ // source can be null
return source;
}
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);
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 ();
}
}
#if NET_2_0
- private IDictionary _data;
-
public virtual IDictionary Data {
get {
if (_data == null) {
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)
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 + ")";
- }
}
}