2015-04-24 30 views
5

Atılmış bir Özel Durumu yakalamaya çalışıyorum ama aranan yere kadar kabarcık vermiyor. Bu InsertNewUser içinde kırılır 'İstisna bulamıyor

söyleyerek s catch bloğu 'türünde bir istisna 'System.Exception' PeakPOS.exe oluştu ancak kullanıcı kodu işlenmedi' Ben debugger tıklarsanız

Devam, App.g.i.cs adlı bir dosyaya gider ve anlamadığım bir satırda kırılır, ancak aradaki hata ayıklama ile ilgili bir şey vardır. Uygulama bundan sonra sona erer.

Yeniden isimlendirildiğinde ve sonra yeniden yakalandığında ve işlendiğinde (işlenecek) özel durumun neden işlenmediğini söylüyorsunuz?


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

"Bu Özel Durum oluştuğunda kes" ibaresi yazan onay kutusunu işaretlemeyi denediniz mi? Ben hata ayıklama modunda iken istisna –

+0

@ Soagar: Evet. Ne olur, App.g.i.cs dosyasına gider ve if ifadesini daha önce olduğu gibi koparır, artık sadece yakalamada kırılmaz. Merak ediyorum, yanlış anlamaya çalışıyorum. Kullanılmayan bir istisna yakalamak mı? – ShrimpCrackers

cevap

4

Bu, async çalışması için beklenen davranıştır. Kodunuz, yöntemin eşzamanlı kısmından atılan istisnaları ele alır/yakalar, ancak async bölümüyle başa çıkmak için uygulama genişlemesine izin verir.

InsertNewUser yönteminin (eşzamanlı kısım) ilk satırında açıkça istisna atarsanız, beklediğiniz davranışları gözlemleyebilirsiniz.

Düzelt: doğru sizin async yöntemidir.

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

Ve await yöntem daha ("zaman uyumsuz viral olduğunu" olduğuna dikkat - Async/Await Best Practices): Bu uygulamayı teselli if (WPF/WinForm/Asp.Net kilitlenmeye

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

Ya da en azından .Wait - await vs Task.Wait - Deadlock?):

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

ya yapamıyorsan - en azından async void yöntemi çağırmak için uygun Fire-and-forget with async vs "old async delegate" kullanmak s.

Not: async void kötü bir uygulamadır ve yalnızca form olayları için kullanılmalıdır.

+0

Teşekkürler, Alexei. İşe yaradı. C# için yeni olduğumdan ve sadece kısaca async/bekletme özelliğinden faydalandığından ve çok iyi anlamadığından bağlantılara değer veriyorum. – ShrimpCrackers

+0

@ShrimpCrackers'a hoşgeldiniz.Eğer "async"/"await" ile çalışmanız gerekiyorsa, ciddi bir çalışma yapmadan önce [Stephen Cleary] (http://stackoverflow.com/users/263693/stephen-cleary) tarafından en iyi yanıtları taramanızı şiddetle tavsiye ederim. alanı. –