mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.3 KiB
121 lines
3.3 KiB
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) |
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) |
|
|
|
using System.Text; |
|
|
|
namespace Debugger |
|
{ |
|
/// <summary> This convenience class provides access to an exception within the debugee. </summary> |
|
/// <seealso cref="System.Exception" /> |
|
public class Exception: DebuggerObject |
|
{ |
|
Value exception; |
|
|
|
public Value Value { |
|
get { return exception; } |
|
} |
|
|
|
public Exception(Value exception) |
|
{ |
|
this.exception = exception; |
|
} |
|
|
|
/// <summary> The <c>GetType().FullName</c> of the exception. </summary> |
|
/// <seealso cref="System.Exception" /> |
|
public string Type { |
|
get { |
|
return exception.Type.FullName; |
|
} |
|
} |
|
|
|
/// <summary> The <c>Message</c> property of the exception. </summary> |
|
/// <seealso cref="System.Exception" /> |
|
public string Message { |
|
get { |
|
Value message = exception.GetMemberValue("_message"); |
|
return message.IsNull ? string.Empty : message.AsString(); |
|
} |
|
} |
|
|
|
/// <summary> The <c>InnerException</c> property of the exception. </summary> |
|
/// <seealso cref="System.Exception" /> |
|
public Exception InnerException { |
|
get { |
|
Value innerException = exception.GetMemberValue("_innerException"); |
|
return innerException.IsNull ? null : new Exception(innerException); |
|
} |
|
} |
|
|
|
public void MakeValuePermanent() |
|
{ |
|
exception = exception.GetPermanentReference(); |
|
} |
|
|
|
public override string ToString() |
|
{ |
|
StringBuilder sb = new StringBuilder(); |
|
sb.Append(this.Type); |
|
if (!string.IsNullOrEmpty(this.Message)) { |
|
sb.Append(": "); |
|
sb.Append(this.Message); |
|
} |
|
if (this.InnerException != null) { |
|
sb.Append(" ---> "); |
|
sb.Append(this.InnerException.ToString()); |
|
} |
|
return sb.ToString(); |
|
} |
|
|
|
public string GetStackTrace() |
|
{ |
|
return GetStackTrace("--- End of inner exception stack trace ---"); |
|
} |
|
|
|
/// <summary> Returs formated stacktrace for the exception </summary> |
|
/// <exception cref="GetValueException"> Getting the stacktrace involves property |
|
/// evaluation so GetValueException can be thrown in some cicumstances. </exception> |
|
public string GetStackTrace(string endOfInnerExceptionFormat) |
|
{ |
|
StringBuilder sb = new StringBuilder(); |
|
if (this.InnerException != null) { |
|
sb.Append(this.InnerException.GetStackTrace(endOfInnerExceptionFormat)); |
|
sb.Append(" "); |
|
sb.Append(endOfInnerExceptionFormat); |
|
sb.AppendLine(); |
|
} |
|
// Note that evaluation is not possible after a stackoverflow exception |
|
Value stackTrace = exception.GetMemberValue("StackTrace"); |
|
if (!stackTrace.IsNull) { |
|
sb.Append(stackTrace.AsString()); |
|
sb.AppendLine(); |
|
} |
|
return sb.ToString(); |
|
} |
|
} |
|
|
|
public class ExceptionEventArgs: ProcessEventArgs |
|
{ |
|
readonly Exception exception; |
|
readonly ExceptionType exceptionType; |
|
readonly bool isUnhandled; |
|
|
|
public Exception Exception { |
|
get { return exception; } |
|
} |
|
|
|
public ExceptionType ExceptionType { |
|
get { return exceptionType; } |
|
} |
|
|
|
public bool IsUnhandled { |
|
get { return isUnhandled; } |
|
} |
|
|
|
public ExceptionEventArgs(Process process, Exception exception, ExceptionType exceptionType, bool isUnhandled):base(process) |
|
{ |
|
this.exception = exception; |
|
this.exceptionType = exceptionType; |
|
this.isUnhandled = isUnhandled; |
|
} |
|
} |
|
}
|
|
|