public RaygunErrorMessage(Exception exception) { var exceptionType = exception.GetType(); #if IOS MonoTouchException mex = exception as MonoTouchException; if (mex != null && mex.NSException != null) { Message = string.Format("{0}: {1}", mex.NSException.Name, mex.NSException.Reason); ClassName = mex.NSException.Name; } else { #endif Message = string.Format("{0}: {1}", exceptionType.Name, exception.Message); ClassName = exceptionType.FullName; #if IOS } #endif StackTrace = BuildStackTrace(exception); Data = exception.Data; if (exception.InnerException != null) { InnerError = new RaygunErrorMessage(exception.InnerException); } }
public static RaygunErrorMessage Build(Exception exception) { RaygunErrorMessage message = new RaygunErrorMessage(); var exceptionType = exception.GetType(); MonoTouchException mex = exception as MonoTouchException; if (mex != null && mex.NSException != null) { message.Message = mex.NSException.Reason; message.ClassName = mex.NSException.Name; } else { message.Message = exception.Message; message.ClassName = FormatTypeName(exceptionType, true); } message.StackTrace = BuildStackTrace(exception); message.Data = exception.Data; AggregateException ae = exception as AggregateException; if (ae != null && ae.InnerExceptions != null) { message.InnerErrors = new RaygunErrorMessage[ae.InnerExceptions.Count]; int index = 0; foreach (Exception e in ae.InnerExceptions) { message.InnerErrors[index] = Build(e); index++; } } else if (exception.InnerException != null) { message.InnerError = Build(exception.InnerException); } return(message); }
public void ObjCException() { #if !__WATCHOS__ if (Runtime.Arch == Arch.DEVICE) { Assert.Ignore("This test requires wrapper functions, which are not enabled for monotouch-test on device."); } #endif #if !DEBUG && !__WATCHOS__ if (Runtime.Arch != Arch.DEVICE) { Assert.Ignore("This test only works in debug mode in the simulator."); } #endif InstallHandlers(); try { using (var e = new ObjCExceptionTest()) { MonoTouchException thrownException = null; try { objcTargetMode = MarshalObjectiveCExceptionMode.ThrowManagedException; e.ThrowObjCException(); Assert.Fail("managed exception not thrown"); } catch (MonoTouchException ex) { thrownException = ex; } Assert.AreEqual("exception was thrown", thrownException.Reason, "objc reason"); Assert.AreEqual("Some exception", thrownException.Name, "objc name"); Assert.AreEqual(1, objcEventArgs.Count, "objc exception"); Assert.AreEqual(thrownException.NSException.Handle, objcEventArgs [0].Exception.Handle, "objc exception"); Assert.AreEqual(defaultObjectiveCExceptionMode, objcEventArgs [0].ExceptionMode, "objc mode"); Assert.AreEqual(0, managedEventArgs.Count, "managed exception"); } } finally { UninstallHandlers(); } }
private static RaygunErrorStackTraceLineMessage[] BuildStackTrace(Exception exception) { var lines = new List <RaygunErrorStackTraceLineMessage>(); #if !__UNIFIED__ MonoTouchException mex = exception as MonoTouchException; if (mex != null && mex.NSException != null) { var ptr = Messaging.intptr_objc_msgSend(mex.NSException.Handle, Selector.GetHandle("callStackSymbols")); var arr = NSArray.StringArrayFromHandle(ptr); foreach (var line in arr) { lines.Add(new RaygunErrorStackTraceLineMessage { FileName = line }); } return(lines.ToArray()); } #endif string stackTraceStr = exception.StackTrace; if (stackTraceStr == null) { var line = new RaygunErrorStackTraceLineMessage { FileName = "none", LineNumber = 0 }; lines.Add(line); return(lines.ToArray()); } try { RaygunErrorStackTraceLineMessage[] array = ParseStackTrace(exception.StackTrace); if (array.Length > 0) { return(array); } } catch { } var stackTrace = new StackTrace(exception, true); var frames = stackTrace.GetFrames(); if (frames == null || frames.Length == 0) { var line = new RaygunErrorStackTraceLineMessage { FileName = "none", LineNumber = 0 }; lines.Add(line); return(lines.ToArray()); } foreach (StackFrame frame in frames) { MethodBase method = frame.GetMethod(); if (method != null) { int lineNumber = frame.GetFileLineNumber(); if (lineNumber == 0) { lineNumber = frame.GetILOffset(); } var methodName = GenerateMethodName(method); string file = frame.GetFileName(); string className = method.ReflectedType != null ? method.ReflectedType.FullName : "(unknown)"; var line = new RaygunErrorStackTraceLineMessage { FileName = file, LineNumber = lineNumber, MethodName = methodName, ClassName = className }; lines.Add(line); } } return(lines.ToArray()); }
private RaygunErrorStackTraceLineMessage[] BuildStackTrace(Exception exception) { var lines = new List <RaygunErrorStackTraceLineMessage>(); #if WINRT string[] delim = { "\r\n" }; string stackTrace = exception.StackTrace ?? exception.Data["Message"] as string; if (stackTrace != null) { var frames = stackTrace.Split(delim, StringSplitOptions.RemoveEmptyEntries); foreach (string line in frames) { lines.Add(new RaygunErrorStackTraceLineMessage() { ClassName = line }); } } #elif WINDOWS_PHONE if (exception.StackTrace != null) { char[] delim = { '\r', '\n' }; var frames = exception.StackTrace.Split(delim); foreach (string line in frames) { if (!"".Equals(line)) { RaygunErrorStackTraceLineMessage stackTraceLineMessage = new RaygunErrorStackTraceLineMessage(); stackTraceLineMessage.ClassName = line; lines.Add(stackTraceLineMessage); } } } #else #if IOS MonoTouchException mex = exception as MonoTouchException; if (mex != null && mex.NSException != null) { var ptr = Messaging.intptr_objc_msgSend(mex.NSException.Handle, Selector.GetHandle("callStackSymbols")); var arr = NSArray.StringArrayFromHandle(ptr); foreach (var line in arr) { lines.Add(new RaygunErrorStackTraceLineMessage { FileName = line }); } return(lines.ToArray()); } #endif var stackTrace = new StackTrace(exception, true); var frames = stackTrace.GetFrames(); if (frames == null || frames.Length == 0) { var line = new RaygunErrorStackTraceLineMessage { FileName = "none", LineNumber = 0 }; lines.Add(line); return(lines.ToArray()); } foreach (StackFrame frame in frames) { MethodBase method = frame.GetMethod(); if (method != null) { int lineNumber = frame.GetFileLineNumber(); if (lineNumber == 0) { lineNumber = frame.GetILOffset(); } var methodName = GenerateMethodName(method); string file = frame.GetFileName(); string className = method.ReflectedType != null ? method.ReflectedType.FullName : "(unknown)"; var line = new RaygunErrorStackTraceLineMessage { FileName = file, LineNumber = lineNumber, MethodName = methodName, ClassName = className }; lines.Add(line); } } #endif return(lines.ToArray()); }
private static RaygunErrorStackTraceLineMessage[] BuildStackTrace(Exception exception) { var lines = new List <RaygunErrorStackTraceLineMessage>(); #if !__UNIFIED__ MonoTouchException mex = exception as MonoTouchException; if (mex != null && mex.NSException != null) { var ptr = Messaging.intptr_objc_msgSend(mex.NSException.Handle, Selector.GetHandle("callStackSymbols")); var arr = NSArray.StringArrayFromHandle(ptr); foreach (var line in arr) { lines.Add(new RaygunErrorStackTraceLineMessage { FileName = line }); } return(lines.ToArray()); } #endif string stackTraceStr = exception.StackTrace; if (stackTraceStr == null) { var line = new RaygunErrorStackTraceLineMessage { FileName = "none", LineNumber = 0 }; lines.Add(line); return(lines.ToArray()); } try { string[] stackTraceLines = stackTraceStr.Split('\n'); foreach (string stackTraceLine in stackTraceLines) { int lineNumber = 0; string fileName = null; string methodName = null; string className = null; string stackTraceLn = stackTraceLine; // Line number int index = stackTraceLine.LastIndexOf(":"); if (index > 0) { bool success = int.TryParse(stackTraceLn.Substring(index + 1), out lineNumber); if (success) { stackTraceLn = stackTraceLn.Substring(0, index); // File name index = stackTraceLn.LastIndexOf("] in "); if (index > 0) { fileName = stackTraceLn.Substring(index + 5); stackTraceLn = stackTraceLn.Substring(0, index); // Method name index = stackTraceLn.LastIndexOf("("); if (index > 0) { index = stackTraceLn.LastIndexOf(".", index); if (index > 0) { int endIndex = stackTraceLn.IndexOf("[0x"); if (endIndex < 0) { endIndex = stackTraceLn.Length; } methodName = stackTraceLn.Substring(index + 1, endIndex - index - 1).Trim(); methodName = methodName.Replace(" (", "("); stackTraceLn = stackTraceLn.Substring(0, index); } } // Class name index = stackTraceLn.IndexOf("at "); if (index >= 0) { className = stackTraceLn.Substring(index + 3); } } else { fileName = stackTraceLn; } } else { index = stackTraceLn.IndexOf("at "); if (index >= 0) { index += 3; } else { index = 0; } fileName = stackTraceLn.Substring(index); } } else { fileName = stackTraceLn; } var line = new RaygunErrorStackTraceLineMessage { FileName = fileName, LineNumber = lineNumber, MethodName = methodName, ClassName = className }; lines.Add(line); } if (lines.Count > 0) { return(lines.ToArray()); } } catch { } var stackTrace = new StackTrace(exception, true); var frames = stackTrace.GetFrames(); if (frames == null || frames.Length == 0) { var line = new RaygunErrorStackTraceLineMessage { FileName = "none", LineNumber = 0 }; lines.Add(line); return(lines.ToArray()); } foreach (StackFrame frame in frames) { MethodBase method = frame.GetMethod(); if (method != null) { int lineNumber = frame.GetFileLineNumber(); if (lineNumber == 0) { lineNumber = frame.GetILOffset(); } var methodName = GenerateMethodName(method); string file = frame.GetFileName(); string className = method.ReflectedType != null ? method.ReflectedType.FullName : "(unknown)"; var line = new RaygunErrorStackTraceLineMessage { FileName = file, LineNumber = lineNumber, MethodName = methodName, ClassName = className }; lines.Add(line); } } return(lines.ToArray()); }