2015-04-24 17 views
5

Tôi đang cố gắng để bắt một ngoại lệ ném, nhưng nó không bong bóng lên đến nơi nó được gọi. Nó phá vỡ trong InsertNewUser 'khối catch s, nóiNgoại lệ không phải là bong bóng lên

'Một ngoại lệ của loại 'System.Exception' xảy ra ở PeakPOS.exe nhưng đã không được xử lý trong mã người dùng'

Nếu tôi bấm vào debugger Tiếp tục, nó đi đến một số tập tin gọi là App.g.i.cs và phá vỡ trên một dòng tôi không hiểu nhưng có cái gì để làm với gỡ lỗi vào giờ nghỉ. Ứng dụng chấm dứt sau đó.

Tại sao điều này nói rằng ngoại lệ được giải quyết khi nó bị thu hồi và sau đó bị bắt lại và xử lý (để được xử lý)?


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

Bạn đã thử bỏ chọn hộp kiểm có ghi 'Break khi ngoại lệ này xảy ra' và chạy lại không? Tôi nghĩ rằng trong khi ở chế độ gỡ lỗi nó phá vỡ tại trường hợp ngoại lệ –

+0

@Saagar: Có. Điều gì xảy ra là nó đi vào tập tin App.g.i.cs và phá vỡ trên câu lệnh if giống như trước đây, nó chỉ không phá vỡ trong đánh bắt nữa. Tôi tự hỏi liệu tôi có hiểu lầm hay không. Bắt một ngoại lệ không xử lý nó? – ShrimpCrackers

Trả lời

4

Hành vi này được mong đợi cho hoạt động async. Mã của bạn xử lý/bắt ngoại lệ được ném từ phần đồng bộ của phương thức, nhưng cho phép ứng dụng xử lý rộng rãi để xử lý phần không đồng bộ.

Bạn có thể quan sát hành vi mà bạn mong đợi nếu bạn ném ngoại lệ rõ ràng trên dòng đầu tiên của phương thức InsertNewUser (phần đồng bộ).

Khắc phục: đúng cách await phương thức async của bạn.

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

Và hơn await phương pháp này (lưu ý rằng "async là virus" - Async/Await Best Practices):

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

Hoặc ít nhất .Wait nếu nó an ủi ứng dụng (WPF/WinForm/Asp.Net sẽ bế tắc - await vs Task.Wait - Deadlock?):

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

Nếu bạn không thể làm một trong hai - ít nhất là sử dụng thích hợp Fire-and-forget with async vs "old async delegate" gọi async void phương pháp S.

Lưu ý: async void là thực tiễn không tốt và chỉ nên được sử dụng cho các sự kiện biểu mẫu.

+0

Cảm ơn, Alexei. Nó đã làm việc. Đánh giá cao các liên kết kể từ khi tôi mới đến C# và chỉ có một thời gian ngắn lướt qua tính năng không đồng bộ/chờ đợi và không hiểu nó rất tốt. – ShrimpCrackers

+0

@ShrimpCrackers chào mừng.Nếu bạn cần làm việc với 'async' /' await', tôi khuyên bạn nên quét qua các câu trả lời hàng đầu của [Stephen Cleary] (http://stackoverflow.com/users/263693/stephen-cleary) trước khi thực hiện bất kỳ công việc nghiêm túc nào trong đó khu vực. –

Các vấn đề liên quan