2010-04-29 23 views
10

Tôi muốn có thể phá vỡ ngoại lệ khi gỡ lỗi ... như trong Hộp thoại Debug/Exception của Visual Studio 2008, ngoại trừ chương trình của tôi có nhiều ngoại lệ hợp lệ trước khi tôi nhận được bit mà tôi muốn gỡ lỗi.Tôi có thể bật/tắt vi phạm ngoại lệ theo chương trình không?

Vì vậy, thay vì bật và tắt thủ công bằng hộp thoại mỗi khi có thể tự động thực hiện bằng #pragma hoặc một số phương pháp khác để nó chỉ xảy ra trong một đoạn mã cụ thể?

+0

Tôi không nghĩ rằng bạn có thể, nhưng tôi không biết chắc chắn. –

+1

Chương trình của bạn có nhiều ngoại lệ hợp lệ? Điều đó nghĩa là gì? –

+1

Điều đó có nghĩa là tôi đang sử dụng các thư viện sử dụng ngoại lệ để báo cáo lại các điều kiện trong mã. Chúng là cảnh báo và không gây tử vong và là một phần của API, vì vậy tôi không thể ngăn chặn chúng và phải bắt chúng và viết mã một cách thích hợp. – AnthonyLambert

Trả lời

6

Cách duy nhất để làm điều gì đó gần với điều này là bằng cách đặt DebuggerNonUserCodeAttribute vào phương pháp của bạn.

Điều này sẽ đảm bảo mọi ngoại lệ trong phương pháp được đánh dấu sẽ không gây ra vi phạm ngoại lệ.

Tốt giải thích về nó here ...

Đây là một thuộc tính mà bạn đặt chống lại một phương pháp để nói với trình gỡ lỗi "Không có gì để làm với tôi guv'. Không phải là mã của tôi!". Trình gỡ lỗi độc lập sẽ tin bạn và sẽ không phá vỡ phương thức đó: sử dụng thuộc tính làm cho trình gỡ lỗi bỏ qua toàn bộ phương thức, ngay cả khi bạn đang bước qua mã; ngoại lệ xảy ra và sau đó bị bắt trong phương thức sẽ không đột nhập vào trình gỡ lỗi.Nó sẽ xử lý nó như thể đó là một cuộc gọi đến một hội đồng khung, và nên một ngoại lệ đi unhandled, nó sẽ được báo cáo một cấp lên ngăn xếp cuộc gọi, trong mã gọi là phương pháp.

dụ Code:

public class Foo 
{ 
    [DebuggerNonUserCode] 
    public void MethodThatThrowsException() 
    { 
     ... 
    { 
} 
1

Bọc khối catch của bạn ở # nếu DEBUG

public void Foo() 
    { 
     #if DEBUG 
     try 
     #endif 
     { 
      //Code goes here 
     } 
     #if DEBUG 
     catch (Exception e) 
     { 
      //Execption code here 
     } 
     #endif 
    } 

Tôi muốn giữ các dấu ngoặc nhọn bên ngoài của # nếu như vậy nó giữ mã trong phạm vi tương tự nếu bên trong hoặc bên ngoài của debug.

Nếu bạn vẫn muốn handeling execption nhưng muốn biết thêm chi tiết bạn có thể làm điều này

 try 
     { 
      //code 
     } 
     catch (FileNotFoundException e) 
     { 
      //Normal Code here 
      #if DEBUG 
      //More Detail here 
      #endif 
     } 
     #if DEBUG 
     catch (Exception e) 
     { 
      //handel other exceptions here 
     } 
     #endif 
+0

sử dụng một cái gì đó như thế này có vẻ sạch hơn một chút: [Có điều kiện ("Debug")] riêng void MyMethod() { ... } –

+0

Vấn đề của tôi không phải là thử bắt nhưng đột nhập vào gỡ lỗi trên ném. ... – AnthonyLambert

2

gì về conditional breakpoints? Nếu tôi hiểu chính xác, bạn có thể chỉ có điểm dừng khi giá trị của biến hoặc biểu thức nhất định là đúng.

1

Đây là một chút quá muộn đối với bạn, nhưng đây là lý do lớn nhất tôi thường cố gắng dạy mọi người sử dụng ngoại lệ một cách thận trọng. Chỉ sử dụng ngoại lệ khi một cái gì đó thảm khốc đã xảy ra và khả năng tiếp tục hợp lý của bạn đã biến mất.

Khi gỡ lỗi chương trình, tôi thường lật các ngoại lệ đầu tiên (Debug -> Exceptions) để gỡ lỗi ứng dụng. Nếu có rất nhiều trường hợp ngoại lệ xảy ra thì rất khó để tìm ra một nơi nào đó đã "sai".

Ngoài ra, điều này dẫn đến một số mẫu chống giống như "cú đánh bắt" khét tiếng và làm xáo trộn các vấn đề thực sự. Để biết thêm thông tin về điều đó, hãy xem blog post Tôi đã thực hiện đối tượng.

Về vấn đề của bạn, bạn có thể bật gỡ lỗi cơ hội đầu tiên chỉ cho một loại ngoại lệ cụ thể. Điều này sẽ hoạt động tốt trừ khi các ngoại lệ khác cùng loại.

+0

Tôi khuyên bạn nên triển khai các ngoại lệ cảnh báo và ngoại lệ gây tử vong được nhóm theo chức năng bạn chỉ có thể bật/tắt những cái bạn muốn bẫy. Tôi nghĩ rằng ngoại lệ không nên được sử dụng chỉ được sử dụng một cách chính xác! Vấn đề của tôi là tôi không viết tất cả các mã tạo ra ngoại lệ và họ sử dụng các ngoại lệ chung ở khắp mọi nơi để khó phân biệt. – AnthonyLambert

0

Bạn cũng có thể sử dụng các xác nhận thay vì các điểm ngắt. Ví dụ, nếu bạn chỉ muốn breakpoint trên lặp thứ 5 của một vòng lặp trên lần thứ hai bạn gọi chức năng đó, bạn có thể làm:

bool breakLoop = false; 

... 
    Work(); // Will not break on 5th iteration. 
    breakLoop = true; 
    Work(); // Will break on 5th iteration. 
... 

public void Work() { 
    for(int i=0 ; i < 10 ; i++) { 
     Debug.Assert (!(breakLoop && i == 5)); 
     ... 
    } 
} 

Vì vậy, trong cuộc gọi đầu tiên để làm việc, trong khi breakLoop là sai, vòng lặp sẽ chạy qua mà không cần khẳng định, lần thứ hai thông qua vòng lặp sẽ bị ngắt.

+1

Bạn có thể sử dụng tính năng Lượt truy cập trên các điểm ngắt thông thường để thực hiện điều này mà không cần mã. – Jeremy

+0

Đúng, một nửa trong số những gì tôi đang phân giải, nhưng tôi đã cố gắng chứng minh một hiệu trưởng chung của việc sử dụng các biến cấu hình cũng như các điều kiện để xác định khi nào các xác nhận được kích hoạt. –

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