2010-05-21 28 views
6

Nếu tôi có một chuỗi phương pháp như sau:Phương pháp chaining và ngoại lệ trong C#

 var abc = new ABC(); 
     abc.method1() 
      .method2() 
      .methodThrowsException() 
      .method3() 
      ; 

giả sử tôi đã xác định method1(), method2()method3() như

public ABC method1() { 
     return this; 
    } 

methodThrowsException() như

public ABC method3() { 
     throw new ArgumentException(); 
    } 

Khi chạy mã, nó có khả năng không le để biết dòng mã cụ thể nào đã ném ngoại lệ, hay nó sẽ xem xét tất cả các phương thức chuỗi chỉ là một dòng? Tôi đã thực hiện một thử nghiệm đơn giản và có vẻ như nó coi tất cả như chỉ là một dòng nhưng Method Chaining nói

phương pháp Đưa vào dòng riêng biệt cũng làm cho gỡ dễ dàng hơn như lỗi thông điệp và kiểm soát debugger là thường trên một dòng theo từng dòng.

Tôi có thiếu thứ gì đó hoặc không áp dụng cho C#?

Cảm ơn

Edit: đây là những gì tôi đang nhận được:

alt text http://img163.imageshack.us/img163/4503/83077881.png

+1

Liên kết hình ảnh giờ đây bị hỏng, bạn có thể sửa chữa nó không? – ahsteele

Trả lời

6

Nếu bạn nhìn vào dấu vết ngăn xếp ngăn xếp, được hiển thị như một phần của chi tiết ngoại lệ, bạn sẽ thấy vị trí chính xác của ngoại lệ, bất kể bạn định dạng mã như thế nào.

Tôi đoán rằng việc định dạng mã khác nhau sẽ hữu ích nếu trình gỡ lỗi cho phép bạn đặt điểm ngắt trên một dòng cụ thể, nhưng trong C#, các điểm ngắt được đặt trên các biểu thức riêng lẻ, vì vậy điều này sẽ không thực sự hữu ích. Có thể bạn cần phải viết lại mã như thế này để cho phép đặt điểm ngắt:

var abc = new ABC(); 
var abc1 = abc.method1(); 
var abc2 = abc1.method2(); 
// etc... 

Điều tương tự cũng áp dụng cho việc làm nổi bật biểu thức hiện tại (trong ảnh chụp màn hình). Tuy nhiên, thông tin chính xác về ngoại lệ luôn có sẵn trong theo dõi ngăn xếp.

1

Các debugger VisualStudio (tôi giả sử bạn đang sử dụng VS và không Mono, vì Mono không có một trình gỡ rối) biết dòng thực tế mà mã của bạn đang thực hiện và không cuộn tất cả các câu lệnh tới dấu chấm phẩy gần nhất, vì hầu hết các trình gỡ rối C/C++ có xu hướng làm. Trong cùng một cách, ngay cả khi bạn đặt tất cả các tuyên bố trên cùng một dòng, VS có thể cho bạn thấy phương thức nào đang thực thi và phương thức nào đã ném ngoại lệ.

Chỉnh sửa: Bạn có thực sự có ngoại lệ khi bị ném không? Sau đó, hãy xem dấu vết ngăn xếp ngoại lệ.

+0

Trên thực tế Mono có trình gỡ lỗi nhưng nó ít điện hơn so với số – abatishchev

+0

của VS Vâng, tôi chỉ phát hiện ra bằng cách xem trang của họ. –

+0

Nhìn vào chỉnh sửa của tôi. –

1

Nếu bạn chạy mã mẫu của mình, bạn sẽ thấy rằng dòng được báo cáo trong theo dõi ngăn xếp thực sự là dòng nơi ngoại lệ được ném và không phải là đường của cuộc gọi phương thức. Trình gỡ lỗi VS cũng sẽ dừng ở dòng này chứ không phải trên lời gọi phương thức.

Cập nhật: Khi lỗi màu xanh lá cây ở bên trái của ảnh chụp màn hình cho biết bạn không ở trên cùng của ngăn xếp cuộc gọi. Mở cửa sổ cuộc gọi Ngăn xếp cuộc gọi (ví dụ: qua menu Gỡ lỗi -> Windows -> Ngăn xếp thư) và nhấp đúp vào dòng đầu tiên để đến địa điểm mà ngoại lệ thực sự bị ném. Phương thức đầu tiên trên ngăn xếp cuộc gọi cũng sẽ là method3().

Lưu ý rằng trích dẫn từ Martin Fowler đề cập đến gỡ lỗi nói chung, vì vậy nó có thể đúng với các IDE Java hoặc các trình gỡ lỗi tích hợp khác nhưng không phải cho Visual Studio IDE. Tuy nhiên, bạn sẽ có thể dễ dàng xác định phương pháp gây ra sự cố bằng cách xem dấu vết ngăn xếp của ngoại lệ.

1

Bạn có thể xem chính xác dòng mã nơi ngoại lệ được tạo ra, nhưng dòng mã được gọi là phương pháp mà ném ngoại lệ sẽ là 2 (xem đánh số dưới đây)

  try { 

Line 1  var abc = new ABC(); 
Line 2  abc.method1() 
Line 3   .method2() 
Line 4   .methodThrowsException() 
Line 5   .method3(); 
Line 6 catch(Exception e) 
     { 
      StackTrace t = new StackTrace(e, true); 
     } 

Các stacktrace (bạn có thể nhìn thấy điều đó trong stacktrace ngoại lệ hoặc bằng cách tạo ra một đối tượng stackTrace) sẽ chứa 2 khung:

  • là người đầu tiên sẽ có mặt tại dòng và nộp ở đâu phương pháp mà ném ngoại lệ được định nghĩa

  • dòng thứ hai sẽ ở dòng 2

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