2016-04-05 5 views
10

Wenn ich eine UWP-Anwendung mit dem .NET Native Compiler kompiliere und Code-Optimierungen (im Wesentlichen Release-Modus) einschalten, bekomme ich eine NullReferenceException, wenn ich versuche, auf die eigentliche Ausnahme zuzugreifen der Fangblock.Code im gefilterten Ausnahme-Handler löst NullReferenceException beim Zugriff auf Ausnahme

Codebeispiel:

try 
{ 
    throw new ArgumentNullException("Param"); 
} 
catch (ArgumentNullException ex) when (ex.ParamName == "Param") 
{ 
    ErrorBlock.Text = ex.ParamName; // ErrorBlock is a TextBlock in the xaml 
} 
catch (Exception) 
{ 
} 

Es geht in den richtigen catch-Block, und wirft ein NullReferenceException wenn ich ex zugreifen. Dies schlägt nur fehl, wenn sowohl .Net Native als auch Codeoptimierungen aktiviert sind.

Was verursacht dieses Problem?

+1

@Pan warum die Tags entfernen? Es scheint mit diesem Build-Modus verwandt zu sein und somit möglicherweise ein Compiler-Problem mit .NET nativ. –

+0

Weil sie irrelevant sind. 'exc.Message' ist null. Dies ist eine einfache NulLReferenceException. Das OP hat den Konstruktor aufgerufen, der nur einen Parameternamen akzeptiert. –

+3

Nein, es ist nicht ... Die Nachricht ist voreingestellt. Bitte versuchen Sie diesen Code selbst. –

Antwort

2

Ich arbeite an der .NET native Laufzeit und Compiler-Team.

Dies ist ein Fehler innerhalb unseres Compilers. Sie können sich jede Ausnahmebehandlungsregion (versuchen, fangen, schließlich, wann) als kleine Funktion oder "Funclet" vorstellen. Wir verlieren den Überblick über das Ausnahmeobjekt, wenn wir den Stack für das "wann" (aka Filterblock) einrichten. Dieser Fehler wird in Windows Tools 1.3 behoben, die ohne größere Rückschläge in ein oder zwei Wochen ausgeliefert werden sollten. Es wird als Update für Leute angezeigt, die VS 2015 Update 2 installiert haben.

Lassen Sie mich wissen, wenn Sie weitere Fragen haben.

+0

Danke @Matt! Ich sah etwas anderes Verhalten in 3 Szenarien: non-async, async, aber nicht erwartet und async + erwartet. Ich gebe allen 3 eine Chance, wenn das Update herauskommt. – FUR10N

+0

Ausgezeichnet. Bitte lassen Sie uns wissen, wie es geht.Wir hören gerne von Leuten unter [email protected] –

5

Ich bin mir nicht ganz sicher, warum es falsch läuft (seit einiger Zeit Debugging), aber das Fehlen von await machte mich neugierig.

Wenn Sie warten auf die ShowAsync Methode der Code ohne Probleme läuft (natürlich müssen Sie die Methode machen async, wenn Sie das noch nicht getan haben):

await new MessageDialog("Argument null exception: " + argEx.Message).ShowAsync(); 

Während der Codeblock ohne await gescheitert. Nicht sicher, ob das ein Fehler oder etwas ist, das Sie behoben haben sollten ...

+0

Hmm, das hat auch für mich funktioniert! Ich wusste nicht, dass es mit async verwandt war/warte. Der tatsächliche Code, in dem ich dies gefunden habe, wartet nicht auf ein bestimmtes Ergebnis nach Design (es ist sowieso alles in ICommands, also wären sie async void). Ich denke nicht, dass Sie das sowieso erwarten sollten, oder? – FUR10N

+0

Ja, jeder Async sollte abgewartet werden. –

+0

Dies ist eine langwierige Aufgabe, und ich brauche keine weitere Folge zu planen. Ich möchte das Feuer-und-Vergessen-Verhalten hier. Das Warten ist nicht wirklich eine Option. – FUR10N

Verwandte Themen