2011-10-12 10 views
5

Tôi tự hỏi liệu có một công cụ để tìm các ngoại lệ không bị bắt trong C# bằng cách sử dụng phân tích mã tĩnh không? Về cơ bản tôi muốn chọn một methodA() và muốn có một danh sách tất cả các ngoại lệ được đưa ra bởi methodA() và tất cả các phương thức được gọi bởi methodA(). Tôi đã thử ReSharper + Agent JohnsonAtomineerUtils, cả hai đều không thực hiện được thao tác đơn giản này.Tìm các trường hợp ngoại lệ chưa từng có trong C# code

Dưới đây là code ví dụ của tôi:

public class Rectangle 
{ 
    public int Width { get; set; } 
    public int Height { get; set; } 

    public int Area() 
    { 
     CheckProperties(); 
     long x = Width * Height; 
     if (x > 10) 
      throw new ArgumentOutOfRangeException(); 
     return (int) x; 
    } 

    private void CheckProperties() 
    { 
     if (Width < 0 || Height < 0) 
      throw new InvalidOperationException(); 
    } 
} 

Công cụ này sẽ có thể cho tôi biết (dưới mọi hình thức) mà Diện tích() phương pháp sẽ ném ArgumentOutOfRangeException hoặc InvalidOperationException.

+3

tôi thấy những gì bạn muốn và nơi bạn đang cố gắng để đi nhưng vẫn còn, xem xét rằng trong nhiều trường hợp nó là ok để ném ngoại lệ từ mã, thực tế là mỗi khi bạn sử dụng các phương pháp đó từ các lớp tiêu thụ thực tế của bạn, bạn nên bắt ở đó, có lẽ 100% tốt mà Khu vực ném một cái gì đó và sẽ không cần bắt ở đó, nhưng ai gọi Rectangle.Area nên ... –

+0

@Davide Piras: Tôi hiểu quan điểm của bạn và đồng ý với bạn, nhưng hãy xem xét việc bạn đang sử dụng thư viện của bên thứ ba với tài liệu thực sự tồi tệ - việc tìm kiếm không bị bắt (hoặc gọi chúng là "có thể bị ném") ngoại lệ sẽ thực sự dễ dàng gỡ lỗi và phát triển. – Korexio

Trả lời

6

Tôi đã sử dụng một R # addin lần điều đó đã làm điều đó trong IDE - Đặc biệt. Ý tưởng tồi, chỉ ra rằng nó phàn nàn về mỗi cuộc gọi string.Format duy nhất và các trường hợp phổ biến tương tự mà thực sự có thể ném, nhưng điều đó sẽ không gây ra vấn đề.

Quyết định cho chính mình nếu nó có giá trị nó: https://github.com/CSharpAnalyzers/ExceptionalReSharper

+0

Khi tôi sử dụng một chương trình đơn giản "Console.WriteLine (hình chữ nhật mới(). Area());" với lớp được đưa ra ở trên, ngoại lệ chỉ cho tôi một lỗi cho Console.WriteLine (...) (System.IO.IOException uncaught) nhưng không cho cuộc gọi đến Area() ... Cách khác vòng này sẽ hữu ích, nhưng theo cách này, nó không có cải thiện gì cả ... – Korexio

+1

Đừng bận tâm, tìm ra vấn đề: Tôi đã không khắc phục được vấn đề trong phương thức Area() - vì vậy Exceptional bỏ qua cuộc gọi. Thêm tài liệu vào Area() dẫn đến một cảnh báo trong Main (...). – Korexio

+0

Nếu không có vấn đề được mô tả ở trên (http://exceptionplugin.codeplex.com/workitem/9632) Ngoại lệ có vẻ như là một công cụ hữu ích. Các đề xuất công cụ khác vẫn được hoan nghênh! – Korexio