2015-04-24 2 views
5

Я пытаюсь поймать брошенное Исключение, но оно не пузырится до того места, где оно было вызвано. Он ломает в InsertNewUser «поймать блока, заявив, чтоИсключение не пузырится вверх

„Исключение типа „System.Exception“ произошло в PeakPOS.exe, но не был обработан в пользовательском коде“

Если я нажимаю на отладчик Продолжайте, он переходит к некоторому файлу с именем App.g.i.cs и разбивается на строку, которую я не понимаю, но имеет какое-то отношение к отладке при разрыве. После этого приложение прекращается.

Почему это говорит о том, что исключение необработанно, когда оно вновь отвергается, а затем повторно поймано и обрабатывается (подлежит обработке)?


AccessViewModel.cs

public void SaveNewUser(Popup popup) 
{ 
    UserAccounts.Add(TempUser); 

    string salt = PeakCrypto.GenerateSalt(); 
    string hash = PeakCrypto.GenerateHashedPassword(Password + salt); 
    try 
    { 
     PeakDB.InsertNewUser(TempUser, salt, hash); 
    } 
    catch (Exception e) 
    { 
     //TODO notify user that new account could not be saved 
    } 

    CreateNewAccount(); 

    if (popup != null) 
     popup.IsOpen = false; 
} 

PeakDB.cs

public static async void InsertNewUser(UserAccount user, String salt, String hash) 
{ 
    var db = await DatabaseHelper.GetDatabaseAsync(); 

    try 
    { 
     using (var userStatement = await db.PrepareStatementAsync(
      "INSERT INTO AccessAccounts (FirstName, LastName, Salt, Hash) VALUES(@first, @last, @salt, @hash)")) 
     { 
      userStatement.BindTextParameterWithName("@first", user.FirstName); 
      userStatement.BindTextParameterWithName("@last", user.LastName); 
      userStatement.BindTextParameterWithName("@salt", salt); 
      userStatement.BindTextParameterWithName("@hash", hash); 
      await userStatement.StepAsync(); 
     } 
    } 
    catch(Exception e) 
    { 
     // TODO: log the exception error 
     throw; 
    } 
} 

App.g.i.cs

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION 
    UnhandledException += (sender, e) => 
    { 
     if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break(); 
    }; 
#endif 
+0

Вы попытались снять флажок с надписью «Перерыв, когда это исключение», и запустить снова? Я думаю, что в режиме отладки он прерывается при исключении –

+0

@Saagar: Да. Случается, что он идет в файл App.g.i.cs и разбивается на оператор if так же, как и раньше, он больше не ломается в catch. Интересно, не ошибаюсь ли я/пытаюсь поймать. Ловит ли исключение, не обращаясь с ним? – ShrimpCrackers

ответ

4

Ожидаемое поведение для операции async. Ваш код обрабатывает/исключает исключения из синхронной части метода, но позволяет использовать дескриптор приложения для обработки части async.

Вы можете наблюдать за поведением, которое вы ожидаете, если вы явно генерируете исключение в первой строке метода InsertNewUser (синхронная часть).

Исправление: правильно await Ваш async способ.

// must return at least `Task` to be awaitable 
public static async Task InsertNewUser(... 

И чем await метод (обратите внимание, что "асинхронной вирусный" - Async/Await Best Practices):

try 
    { 
     await PeakDB.InsertNewUser(TempUser, salt, hash); 
    } 
    catch (Exception e) ... 

Или, по крайней мере, .Wait если это утешит приложение (WPF/WinForm/Asp.Net будет тупик - await vs Task.Wait - Deadlock?):

try 
    { 
     PeakDB.InsertNewUser(TempUser, salt, hash).Wait(); 
    } 
    catch (Exception e) ... 

Если вы не можете сделать что-либо - по крайней мере, использовать соответствующую Fire-and-forget with async vs "old async delegate" для вызова метода async void s.

Примечание: async void является плохой практикой и может использоваться только для событий формы.

+0

Спасибо, Алексей. Это сработало. Цените ссылки, так как я новичок в C#, и только кратко просмотрел функцию async/await и не очень хорошо ее понимаю. – ShrimpCrackers

+0

@ShrimpCrackers приветствуются.Если вам нужно работать с 'async' /' await', я настоятельно рекомендую просмотреть верхние ответы [Stephen Cleary] (http://stackoverflow.com/users/263693/stephen-cleary), прежде чем выполнять какую-либо серьезную работу в этом площадь. –

Смежные вопросы