[mono-android] Avoidable TPF error in M4A
Miha Markic
Miha at rthand.com
Mon Oct 1 07:18:05 UTC 2012
Indeed looks like m4a internally is using a Task to invoke OnCreate. Perhaps it is by design that exceptions aren't handled when invoking OnCreate and applications is stopped if an unhandled exception occurs.
Miha
-----Original Message-----
From: monodroid-bounces at lists.ximian.com [mailto:monodroid-bounces at lists.ximian.com] On Behalf Of Stephan Steiner
Sent: Sunday, September 30, 2012 5:39 PM
To: monodroid at lists.ximian.com
Subject: [mono-android] Avoidable TPF error in M4A
Hi
Here's a little bug I found in M4A (both 4.2.4 and the 4.2.7 beta) and a way to work around it:
Put the following in your app's main activity's OnCreate
int resourceId =
Application.Context.Resources.GetIdentifier("some_non_existing_identifier",
"string", Application.Context.PackageName); string myString = Application.Context.Resources.GetString(resourceId);
And debug the app. You'll get an uncaught exception on the second line (resourceId will be 0, so the resource cannot be found), press continue twice, and debugging will stop and M4A will show you a TPF error about an uncaught Task Exception. This can easily be avoided if all Tasks that M4A uses itself are waited upon, or followed by a task that handles exceptions.
For instance, this is what I'm using inside my M4A projects (derived from a similar class I'm using for my desktop projects):
public class MyTaskFactory
{
public static Task CreateTask(Action action)
{
Task myTask = new Task(action);
addContinuationTask(myTask);
return myTask;
}
public static Task CreateTask(Action action, CancellationToken
token)
{
Task myTask = new Task(action, token);
addContinuationTask(myTask);
return myTask;
}
private static void addContinuationTask(Task myTask)
{
Task continuationTask = myTask.ContinueWith(t =>
{
foreach (var e in t.Exception.Flatten().InnerExceptions)
processException(e);
}, TaskContinuationOptions.OnlyOnFaulted);
Task errorTask = myTask.ContinueWith(t =>
{
AndroidLogModel.Model.AddLogMessage("TaskFactory", "Task cancelled", 5);
}, TaskContinuationOptions.OnlyOnCanceled);
}
protected static void processException(Exception e)
{
AndroidLogModel.Model.AddLogMessage("TaskFactory", "Task
exception: " + e.Message + " at " + e.StackTrace, 4);
}
}
Instead of calling Task.Factory.Create, you'd create your tasks using MyTaskFactory.CreateTask.
--
View this message in context: http://mono-for-android.1047100.n5.nabble.com/Avoidable-TPF-error-in-M4A-tp5712017.html
Sent from the Mono for Android mailing list archive at Nabble.com.
_______________________________________________
Monodroid mailing list
Monodroid at lists.ximian.com
UNSUBSCRIBE INFORMATION:
http://lists.ximian.com/mailman/listinfo/monodroid
More information about the Monodroid
mailing list