In früheren Versionen von Monotouch, habe ich dies zu tun unbeobachtet Ausnahmen zu ignorieren:Wie ignoriere ich unbeobachtete Ausnahmen mit async/await in MonoTouch?
TaskScheduler.UnobservedTaskException += delegate(object sender, UnobservedTaskExceptionEventArgs e) {
Console.WriteLine (e);
e.SetObserved();
};
Ob es eine gute Praxis ist umstritten ist, aber ich mag die gleiche Wirkung mit async
/await
Stichwörter wissen, zu erreichen now officially supported in Xamarin.iOS 6.4.
Hier ist der Code ich zum Testen verwenden:
async void OnClick (object sender, EventArgs e)
{
await Task.Run (() => { throw new Exception(); });
}
Wenn ich es laufen, Pausen Debugger in AsyncVoidMethodBuilder
:
ich, dass .NET 4.5 angeblich changed the behaviour so unobserved exceptions don't crash the app -aber dies lesen Es hilft nicht, wenn Ausnahmen im UIKit-Synchronisationskontext gepostet werden, wo ich sie nicht behandeln kann.
Gibt es eine Möglichkeit, unbeobachtete Ausnahmen von await
in MonoTouch zu ignorieren?
Sie erwähnen es "Pausen" in 'AsyncVoidMethodBuilder'. Bedeutet das, dass, wenn Sie fortfahren, die Ausnahme letztendlich von Ihrem Hundeführer verschluckt wird? Ist dies ein Fall, in dem nur der Debugger diese Ausnahme anhält? Außerdem enthält der Artikel, auf den Sie verwiesen haben, einige app.config-Einstellungen, damit die Ausnahme funktioniert wie .NET 4. Wäre das hilfreich? –
@Brad: Wenn ich "continue" drücke, stürzt der Prozess ab, weil die Ausnahme vom zugrunde liegenden 'UIKitSynchronizationContext' erneut auf den UI-Thread geworfen wird. Die Konfigurationseinstellungen dienen dazu, das Verhalten * strikter * zu machen, so dass sie nicht hilfreich sein sollten. Du hast einen gültigen Punkt angesprochen. In früheren Versionen konnte ich die Ausnahmen im Unobserved-Handler abfangen, obwohl sie auf den UI-Thread geworfen wurden. –
Es gibt verschiedene unbeobachtete Handler für Tasks, die AppDomain usw. Versuchen Sie es mit dem für die Benutzeroberfläche spezifischen. Wartet, dass Ausnahmen auf dem SynchronizationContext erneut gesendet werden –