| 

.NET C# Java Javascript Exception

1
Eine Frage beschäftigt mich schon seit längerem und da ich eben wieder drüber gestolpert bin, kommt sie jetzt hier rein:

Ich arbeite zur Designzeit gerne aus Bequemlichkeit mit einer der eigentlichen App vorgeschalteten Testeite, die eigentlich nichts weiter macht als mich in einer TextBox nach einem Seitennamen zu fragen, zu der ich dann direkt hinnavigieren kann.

Jetzt passiert es durchaus, dass man versehentlich mal einen Namen in die TextBox eingibt zu einer Seite, die vielleicht gar nicht existiert.

Diesen Fall würde ich gerne abfangen, denn er führt immer zu einer vollständigen Terminierung der App (im Emulator / Device wird dann wieder der WP7-Homescreen angezeigt und der Debugger wird getrennt, keine Fehlermeldung oder dergleichen).

Man könnte jetzt denken, man könnte doch einfach einen Tray-Catch-Block um die Navigation bauen, in etwa so:

try 
{
NavigationService.Navigate(new Uri(targetUri, UriKind.RelativeOrAbsolute));
}
catch
{
MessageBox.Show("Page not found.");
}


Aber das klappt nicht, App stürzt trotzdem ab und der Catch-Block wird gar nicht durchlaufen.

Woran liegt das? Wie macht man es richtig?
01.05.2011
Achso 340 1 6
2 Antworten
1
Die Antwort von Mario hat mir schon mal sehr weitergeholfen, ich hab immer an den total falschen Stellen geguckt. Vielen Dank!

Nach etwas rumprobieren habe ich rausgefunden, dass es trotzdem nicht reicht, im EventHandler einfach nur e.Handled auf true zu setzen. Dann stützt die App zwar nicht sofort ab, aber ein paar Sekunden später dann doch. Man muss zusätzlich noch dafür sorgen, dass der NavigationService wieder eine gültige URL bekommt, z.B. indem man die fehlerhafte Naviagtion durch GoBack() abbricht. Ansonsten bleibt die alte Fehelrhafte URL weiterhin gesetzt und dann werden weiter Exceptions geworfen.

Hier mein finaler Codeschnipsel, der bei Anspringen einer falschen Seite nicht mehr abschmiert, sondern wie gewünscht einfach nur eine MessageBox anzeigt:

// Constructor of the page
public MainPage()
{
var app = Application.Current as App;
app.RootFrame.NavigationFailed += RootFrame_NavigationFailed;

InitializeComponent();
}

// Code to execute if a navigation fails
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
var navigationService = sender as System.Windows.Navigation.NavigationService;

if (navigationService.CanGoBack)
{
// Cancel the invalid navigation request!!!
navigationService.GoBack();

// Mark exception as handled
e.Handled = true;

// Inform the user
MessageBox.Show("Navigation failed.");
}
}
04.05.2011
Achso 340 1 6
0
Folgende Exception tritt in diesem Falle auf:

{System.InvalidOperationException: No XAML was found at the location '/Pagre1.xaml'.
bei System.Windows.Navigation.PageResourceContentLoader.EndLoad(IAsyncResult asyncResult)
bei System.Windows.Navigation.NavigationService.ContentLoader_BeginLoad_Callback(IAsyncResult result)
...


Du musst das Try & Catch in der Methode RootFrame_NavigationFailed in der App.xaml.cs handlen.

Tipp: Ich weiss jetzt nicht, was der DesignGuide sagt, ob du dort Try/Catch verwenden darfst, ich würde eher in der Methode eine Messagebox ausgeben, dass ein Fehler aufgetreten ist und dann e.Handled = true setzen.
01.05.2011
Mario Priebe 6,0k 3 9
Achso! ;-) Danke!
Achso 01.05.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH