Skip to content

Commit

Permalink
fix(android): Parse java exception name when message missing
Browse files Browse the repository at this point in the history
Not all Java exceptions have messages, so the default should be to set
the class and java exception parsing style if the error class is 
detected.
  • Loading branch information
kattrali committed Jul 1, 2019
1 parent 91319cb commit f82a87d
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

### Bug fixes

* (Android) Fix error class and message parsing for uncaught Java exceptions
without message contents
* Show report metadata added using `Bugsnag.Metadata.Add()` in native crash
reports
[#157](https://github.com/bugsnag/bugsnag-unity/pull/157)
Expand Down
7 changes: 6 additions & 1 deletion src/BugsnagUnity/Payload/Exception.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,13 @@ public static Exception FromUnityLogMessage(UnityLogMessage logMessage, System.D
{
errorClass = match.Groups["errorClass"].Value;
message = match.Groups["message"].Value.Trim();
lines = new StackTrace(logMessage.StackTrace, StackTraceFormat.AndroidJava).ToArray();
}
else
{
errorClass = message;
message = "";
}
lines = new StackTrace(logMessage.StackTrace, StackTraceFormat.AndroidJava).ToArray();
handledState = HandledState.ForUnhandledException();
}
return new Exception(errorClass, message, lines, handledState);
Expand Down
22 changes: 22 additions & 0 deletions tests/BugsnagUnity.Tests/ExceptionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,28 @@ public void ParseExceptionFromLogMessage()

[Test]
public void ParseAndroidExceptionFromLogMessage()
{
string condition = "AndroidJavaException: java.lang.IllegalArgumentException";
string stacktrace = @"java.lang.IllegalArgumentException
com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash(CrashHelper.java:11)
com.unity3d.player.UnityPlayer.nativeRender(Native Method)";
var logType = UnityEngine.LogType.Error;
var log = new UnityLogMessage(condition, stacktrace, logType);
var exception = Exception.FromUnityLogMessage(log, new System.Diagnostics.StackFrame[] {}, Severity.Warning);
var stack = exception.StackTrace.ToList();
Assert.AreEqual("java.lang.IllegalArgumentException", exception.ErrorClass);
Assert.True(System.String.IsNullOrEmpty(exception.ErrorMessage));
Assert.AreEqual(2, stack.Count);
Assert.AreEqual("com.example.bugsnagcrashplugin.CrashHelper.UnhandledCrash()", stack[0].Method);
Assert.AreEqual("CrashHelper.java", stack[0].File);
Assert.AreEqual(11, stack[0].LineNumber);
Assert.AreEqual("com.unity3d.player.UnityPlayer.nativeRender()", stack[1].Method);
Assert.AreEqual("Native Method", stack[1].File);
Assert.AreEqual(null, stack[1].LineNumber);
}

[Test]
public void ParseAndroidExceptionAndMessageFromLogMessage()
{
string condition = "AndroidJavaException: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2";
string stacktrace = @"java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
Expand Down

0 comments on commit f82a87d

Please sign in to comment.