2013-08-06 20 views
39

Khi trình gỡ lỗi được đính kèm vào quy trình .NET, nó (thường) dừng khi một ngoại lệ chưa được giải quyết được ném.Trình gỡ lỗi không vi phạm/dừng các trường hợp ngoại lệ trong phương thức không đồng bộ

Tuy nhiên, điều này dường như không hoạt động khi bạn đang ở phương thức async.

Các kịch bản tôi đã cố gắng trước khi được liệt kê trong đoạn mã sau:

class Program 
{ 
    static void Main() 
    { 
     // Debugger stopps correctly 
     Task.Run(() => SyncOp()); 

     // Debugger doesn't stop 
     Task.Run(async() => SyncOp()); 

     // Debugger doesn't stop 
     Task.Run((Func<Task>)AsyncTaskOp); 

     // Debugger stops on "Wait()" with "AggregateException" 
     Task.Run(() => AsyncTaskOp().Wait()); 

     // Throws "Exceptions was unhandled by user code" on "await" 
     Task.Run(() => AsyncVoidOp()); 

     Thread.Sleep(2000); 
    } 

    static void SyncOp() 
    { 
     throw new Exception("Exception in sync method"); 
    } 

    async static void AsyncVoidOp() 
    { 
     await AsyncTaskOp(); 
    } 

    async static Task AsyncTaskOp() 
    { 
     await Task.Delay(300); 
     throw new Exception("Exception in async method"); 
    } 
} 

Tôi có thiếu cái gì? Làm thế nào tôi có thể làm cho trình gỡ lỗi phá vỡ/dừng lại ngoại lệ trong AsyncTaskOp()?

+0

Bạn đã bao giờ giải quyết này? –

+0

@RichardSzalay Không, rất tiếc là không. Tôi đoán tôi đã quen với việc sống với điều này. –

Trả lời

25

Dưới menu Debug, chọn Exceptions.... Trong hộp thoại Ngoại lệ, bên cạnh dòng Common Language Runtime Exceptions, hãy chọn hộp Thrown.

+14

Ok, tôi đã biết điều đó. Nhưng sau đó trình gỡ lỗi sẽ phá vỡ * tất cả * ngoại lệ, không chỉ trên những cái chưa được giải quyết, đúng không? Vì vậy, nó không chính xác những gì tôi đang tìm kiếm. –

+3

@SebastianKrysmanski: Tuy nhiên, ngoại lệ được xử lý. Nếu bạn có một phương thức 'async Task', thì ngoại lệ sẽ bị bắt bởi máy trạng thái' async' và được đặt trên 'Task' được trả về. –

+10

Trong Visual Studio 2015, cài đặt ngoại lệ được tìm thấy trong 'Debug' >>' Windows' >> 'Thiết lập ngoại lệ '(Ctrl + Alt + E) –

-2

Tôi đã bao gồm đại biểu ẩn danh trong một lần thử/nắm bắt bên trong Task.Run(() =>.

Task.Run(() => 
{ 
    try 
    { 
      SyncOp()); 
    } 
    catch (Exception ex) 
    { 
      throw; // <--- Put your debugger break point here. 
        // You can also add the exception to a common collection of exceptions found inside the threads so you can weed through them for logging 
    } 

}); 
+2

Không giúp được gì bởi vì trình gỡ lỗi sẽ ngắt tại vị trí ngoại lệ là * bị bắt * - không phải nơi nó được * ném *. –

3

Tôi muốn biết liệu có ai phát hiện ra cách giải quyết vấn đề này không? Có lẽ một thiết lập trong studio hình ảnh mới nhất ...?

Một giải pháp khó chịu nhưng hoàn toàn khả thi (trong trường hợp của tôi) là để ném riêng tùy chỉnh ngoại lệ của tôi và sau đó sửa đổi Stephen Cleary của câu trả lời:

Dưới menu Debug, chọn Exceptions (Bạn có thể sử dụng bàn phím này phím tắt Điều khiển + Alt + E) ... Trong hộp thoại Ngoại lệ, bên cạnh dòng Ngoại lệ thời gian chạy ngoại ngữ chung, hãy chọn hộp Thrown .

là ví dụ cụ thể hơn, thêm tùy chỉnh ngoại lệ của bạn vào danh sách, và sau đó đánh dấu vào "Ném" hộp của nó.

ví dụ:

async static Task AsyncTaskOp() 
{ 
    await Task.Delay(300); 
    throw new MyCustomException("Exception in async method"); 
} 
+2

Điều gì sẽ xảy ra nếu 'Task.Delay()' đưa ra một ngoại lệ khác? –

+0

Thomas, tôi vừa mới mở rộng trên ví dụ của poster ban đầu. Đi ra khỏi logic của bạn, * bất cứ điều gì * có thể thất bại - đó là sự thật, nhưng chúng tôi phải trả lời trong bối cảnh, ... vì vậy chúng tôi có thể đi vòng trong vòng tròn mãi mãi ... Câu trả lời của tôi là trong bối cảnh có trình gỡ lỗi dừng lại ở một mong muốn chỉ trong mã nơi bạn có thể xem giá trị biến cục bộ là gì và có khả năng điều gì gây ra Ngoại lệ. Điều này không dễ dàng đạt được nếu ngoại lệ được ném ra ngoài Nhiệm vụ (theo OP) vì nó có thể trở thành một cơn ác mộng để gỡ lỗi. – Jimbob

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