Ich hatte einen Blick auf die Referenzquelle für System.Windows.Forms.Control
, und den Code, der mit Invoke
beschäftigt sich wie folgt aussieht:
try {
InvokeMarshaledCallback(current);
}
catch (Exception t) {
current.exception = t.GetBaseException();
}
GetBaseException
:
public virtual Exception GetBaseException()
{
Exception inner = InnerException;
Exception back = this;
while (inner != null) {
back = inner;
inner = inner.InnerException;
}
return back;
}
So offensichtlich ist es so von Entwurf. Die Kommentare in der Quelle bieten keine Erklärung dafür, warum sie dies tun.
EDIT: Einige Website, die nun Ansprüche dieser Kommentar kam von einem Mann an Microsoft gegangen ist:
auf dem winform comfirmation im Datensatz Basierend, ist unsere Analyse korrekt von der Ursache und dieses Verhalten ist beabsichtigt. Der Grund war zu verhindern, dass der Benutzer zu viele interne Windows.Forms-Mechanismen sieht. Dies liegt daran, dass das Standardfehlerdialogfeld von Winform auch Application.ThreadException nutzt, um die Ausnahmedetails anzuzeigen. .Net Winform Team trimmt die anderen Ausnahmen Informationen, so dass der Standardfehler Dialog nicht alle Details für den Endbenutzer angezeigt werden.
Auch einige MSFTs haben vorgeschlagen, dieses Verhalten zu ändern. Allerdings .Net Winform-Team denkt, dass das Ändern der Ausnahme zu werfen ist eine brechende Änderung und aus diesem Grund wird WinForms weiterhin die innerste Ausnahme an den Application.ThreadException-Handler senden.
Ich bemerke, dass die 'aware Task.Run()' nicht relevant ist. Sie sollten es aus Ihrer Frage weglassen, da es nur dazu dient, von dem Problem abzulenken, nach dem Sie fragen. –
Das ist interessant. Wenn wir noch eine weitere innere Ausnahme hinzufügen, wird es uns auch geben. – Chris
Flaggers: Sorge dafür, die Frage tatsächlich zu lesen, bevor du sie als Duplikat von [diesem anderen] kennzeichnest (http://stackoverflow.com/questions/15704711/how-cani-i-use-control-invoke-to-trow-) eine Ausnahme, die nicht ignoriert wird? – Juan