2010-08-12 45 views
7

Tôi đang viết một ứng dụng C# sử dụng tự động hóa để kiểm soát một chương trình khác. Đương nhiên chương trình đó phải chạy để chương trình của tôi hoạt động. Khi chương trình của tôi tìm kiếm ứng dụng và không thể tìm thấy nó tôi muốn ném một ngoại lệ (bây giờ sau này tất nhiên tôi có thể thử mở ứng dụng, hoặc yêu cầu người dùng mở nó, hoặc ...).Loại ngoại lệ nào để ném trong trường hợp này?

Tôi có nên triển khai ngoại lệ tùy chỉnh hay không hoặc sử dụng NotSupportedException hiện tại (hoặc một trong các ngoại lệ .NET khác). Nếu ngoại lệ tùy chỉnh, bạn sẽ đề xuất điều gì? Tôi đã suy nghĩ của việc thực hiện một ngoại lệ tùy chỉnh tôi muốn gọi nó là MyAppNameException và sau đó chỉ cần sử dụng tin nhắn để khai báo vấn đề là gì?

Có quy tắc chung nào để ném ngoại lệ theo cách làm cho chương trình của bạn dễ đọc hơn và thân thiện với người dùng hơn hay tôi chỉ cho suy nghĩ quá nhiều :)?

Cảm ơn!

Trả lời

8
  1. Trước tiên, hãy xác định MyAppCustomException làm lớp cơ sở trừu tượng.

  2. Sau đó, kế thừa từ nó với AppNotFoundCustomException.

Bằng cách này bạn có thể bắt tất cả ngoại lệ từ ứng dụng của bạn, hoặc chỉ cụ người.

Dưới đây là một số mã ví dụ minh họa các khái niệm:

public abstract class MyAppCustomException : System.Exception 
{ 
    internal MyAppCustomException(string message) 
     : base(message) 
    { 
    } 

    internal MyAppCustomException(string message, System.Exception innerException) 
     : base(message,innerException) 
    {    
    } 
} 

public class AppNotFoundCustomException : MyAppCustomException 
{ 
    public AppNotFoundCustomException(): base("Could not find app") 
    { 
    } 
} 

Và đây là một khách hàng try/catch dụ:

try 
{ 
    // Do Stuff 
} 
catch(AppNotFoundCustomException) 
{ 
    // We know how to handle this 
} 
catch(MyAppCustomException) // base class 
{ 
    // we don't know how to handle this, but we know it's a problem with our app 
} 
+0

Khi bắt nguồn từ 'System.Exception', [thực tiễn tốt là thực hiện ba hàm tạo chung được đề xuất] (https://msdn.microsoft.com/en-us/library/87cdya3t%28v=vs.110% 29.aspx). Điều đó nói rằng, trong tình huống được mô tả trong câu hỏi, ném một ngoại lệ có thể không phải là cách tiếp cận tốt nhất. Xem [câu trả lời] (http://stackoverflow.com/a/3471960/1497596) bởi @Hans Passant. – DavidRR

3

Các Framework Guidelines book mà tôi sử dụng chỉ ra rằng bạn chỉ nên tạo ra một ngoại lệ tùy chỉnh khi người điều kiện lỗi có thể được xử lý theo lập trình theo cách khác với bất kỳ ngoại lệ hiện có nào.

Trong trường hợp của bạn, nếu bạn muốn tạo ngoại lệ tùy chỉnh để khởi chạy chương trình cài đặt back-end, đó là duy nhất và tôi nghĩ rằng ngoại lệ tùy chỉnh sẽ không sao.

Nếu không, điều gì đó từ chế độ cấp quyền System.Runtime.InteropServices.ExternalException có thể phù hợp.

+0

+1 chỉ để tạo ngoại lệ tùy chỉnh nếu bạn định xử lý chúng theo cách tùy chỉnh. Nếu bạn thực sự có thể làm một cái gì đó lập trình trong tình huống bạn đã mô tả, thì tôi sẽ đi với những gì PostMan đề xuất. – jloubert

1

Vâng, bạn đang lạm dụng nó. Không có gì tốt sẽ xảy ra khi bạn ném một ngoại lệ, bất kỳ ngoại lệ, chương trình đó không phải là kỳ diệu sẽ bắt đầu chạy khi bạn làm. Chỉ những điều xấu có thể xảy ra, giống như một số mã thực sự bắt được ngoại lệ đó và cố gắng tiếp tục. Hoặc không ai bắt được nó và nhận được hộp thoại Báo cáo Lỗi của Windows. Cũng có thể đặt một hộp thông báo và gọi nó là một ngày với Environment.Exit().

Tất nhiên, nó có thể hữu ích hơn cho người dùng nếu bạn thực sự bắt đầu chương trình đó nếu bạn thấy nó không chạy.

+0

+1 Tôi đồng ý, những gì tốt là ngoại lệ thực sự sẽ được trong trường hợp này. Nó có 0 giá trị. – JonH

0

Bạn chắc chắn không nên sử dụng NotSupportedException, như bạn đề xuất, vì ứng dụng của bạn không hỗ trợ phương thức được đề cập. NotSupportedException được sử dụng khi giao diện hoặc lớp trừu tượng được triển khai, nhưng với một số thành viên không được triển khai đầy đủ vì chúng không có ý nghĩa trong ngữ cảnh (đọc từ luồng đầu ra, xóa bộ sưu tập chỉ đọc, v.v.).

Kết hợp gần hơn là một cái gì đó InvalidOperationException, nơi một thành viên có thể được sử dụng, nhưng không được cung cấp trạng thái hiện tại.

Bạn nói "ứng dụng", đề xuất tệp thi hành chứ không phải thành phần để sử dụng bởi một thứ khác. Trong trường hợp này, bạn sẽ không làm bong bóng ngoại lệ lên đến mã gọi (vì không có mã gọi) nhưng sẽ nâng cao hộp thoại (đối với ứng dụng GUI) hoặc ghi vào Console.Error (cho ứng dụng bảng điều khiển). Điều này làm cho nó có khả năng là một trong hai bạn sẽ chỉ hiển thị giá trị của thuộc tính Message của ngoại lệ, hoặc bạn chỉ cần loại lớp để gắn cờ một thông báo cụ thể. Hoặc chỉ đơn giản là bắt nguồn từ AppNotRunningException từ ngoại lệ hoặc chỉ sử dụng ngoại lệ trực tiếp có thể sẽ phục vụ hoàn toàn tốt, tùy thuộc vào hai bạn thấy thuận tiện nhất.

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