2010-01-19 37 views
8

Nếu tôi có những điều sau đây, thực sự cho bất kỳ chuỗi nào bạn kiểm tra IsNullOrEmpty và nó sẽ trống, loại ngoại lệ nào sẽ ném và nó không phải là một đối số cho phương thức?Loại ngoại lệ nào để ném cho các chuỗi

Tôi luôn gặp khó khăn khi chọn các loại ngoại lệ vì có rất nhiều loại trong số đó. Và đây chỉ là lấy một giá trị từ web.config và kiểm tra xem SandboxSoapApiUsername có được trả về trống không.

if(string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername)) 
     throw new WTF do I throw here??? ahhh 

Nó có thể phụ thuộc vào việc sử dụng/ngữ cảnh phải không? Vâng, tôi sẽ sử dụng chuỗi trả về để thiết lập một trường private class. Vì vậy, tôi cần phải kiểm tra xem chuỗi rỗng của nó sớm trong quá trình chứ không phải sau này (thay vì dựa vào mã khác để kiểm tra thuộc tính liên quan đến trường riêng tư, tôi sẽ đặt ConfigUtility.SandboxSoapApiUsername thành).

Vì các thuộc tính trong lớp này mà tôi đang thiết lập mỗi ConfigUtility.MEthodName sẽ được sử dụng trong một yêu cầu SOAP tôi nghĩ có lẽ UriFormatException sẽ phù hợp ở đây mặc dù đây không phải là Uri?

Trả lời

9

Nó phụ thuộc vào chuỗi xuất phát từ đâu. Một đối số có thể gây ra một ArgumentNullException. Cấu hình có thể ném một ConfigurationException (mà dường như có thể áp dụng cho trường hợp này). Hoặc bạn có thể tất nhiên tạo của riêng bạn anyway.

1

Nếu nó được chuyển làm đối số, hãy ném ArgumentNullException.

Nếu không, nó thực sự phụ thuộc vào chuỗi là null có nghĩa là trong ngữ cảnh của ứng dụng của bạn. Đừng sợ để xác định các loại ngoại lệ tùy chỉnh nếu không có cái gì đó trong khung cơ sở cho kịch bản.

10

Phương pháp trong Khuôn khổ .NET thường phân biệt giữa null và giá trị không hợp lệ được chuyển cho đối số. Tôi nghĩ bạn nên ném một đối số ​ Null ​ Ngoại lệ nếu giá trị là null và một Ngoại lệ ​ Đối số nếu nó không hợp lệ.

if (arg == null) 
    throw new ArgumentNullException("arg", "argcannot be null"); 
if (arg == string.Empty) 
    throw new ArgumentException("arg cannot be an empty string", "arg"); 

Nếu giá trị không phải là một cuộc tranh cãi, nhưng, ví dụ, nạp trong quá trình khởi, tôi nghĩ rằng một hợp lệ ​ Operation ​ ngoại lệ sẽ là thích hợp:

if (string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername)) 
    throw new InvalidOperationException("Cannot initialize because " + 
             "SandboxSoapApiUsername not configured"); 
+0

Yea, các ngoại lệ đối số dễ dàng. Đây không phải là một ngoại lệ đối số thay vì kiểm tra giá trị trả về từ một phương thức trước khi tôi đặt một số thuộc tính của lớp này thành giá trị được trả về. – PositiveGuy

4

bạn cần một ngoại lệ InvalidConfiguration - xác định một số

throw new InvalidConfigurationException("Must supply user name") 
+0

Đúng, tốt hơn là mong đợi một ngoại lệ cụ thể hơn là ngoại lệ chung trong mã.Có một cơ hội mà một cái gì đó khác trong phương pháp đó có thể ném một ngoại lệ ArgNull hoặc Arg ... –

+0

nhưng phương thức trả về một chuỗi. Tôi đoán phương pháp vẫn có thể trả về null mặc dù kiểu trả về của nó là chuỗi nếu như bạn nói cái gì khác trả về null trong phương thức đó? – PositiveGuy

+0

nếu bạn ném sau đó nó không trả lại bất cứ điều gì. Đó là điểm ném – pm100

0

Vì có vẻ như có gì đó không được định cấu hình đúng, tôi muốn đề xuất System.Configuration.ConfigurationErrorsException.

Lưu ý: không sử dụng System.Configuration.ConfigurationException. Đó là một phiên bản cũ và đã không được chấp nhận.

Note 2: Mặc dù tôi là 90% chắc chắn chúng tôi đang làm việc với một giá trị cấu hình mất tích, nếu nó là một tham số phương pháp đó là mất tích, ném một ArgumentException hoặc ArgumentOutOfRangeException.

+0

Intellisense không cung cấp cho tôi ConfigurationErrorsException như một tùy chọn ngoại lệ – PositiveGuy

+0

đó là lý do tại sao tôi đã cung cấp loại đủ điều kiện với không gian tên. Hoặc sử dụng * System.Configuration.ConfigurationErrorsException * hoặc nhập/sử dụng "System.Configuration" ở đầu mô-đun. Vì vậy, đó là một thiếu cấu hình? Vâng, * ConfigurationErrorsException * là con đường để đi sau đó. chúc may mắn! –

5

Bạn sẽ thực sự dành phần lớn thời gian của mình từ danh sách dưới đây khi ném một ngoại lệ new (trái ngược với việc chỉ đơn giản là thực hiện throw).

  1. ConfigurationException
    • Trường hợp ngoại lệ được ném ra khi một lỗi hệ thống cấu hình đã xảy ra.
  2. ArgumentException
    • Trường hợp ngoại lệ được ném ra khi một trong các đối số cung cấp cho một phương pháp không hợp lệ.
  3. InvalidOperationException
    • Trường hợp ngoại lệ được ném ra khi một phương pháp gọi là không hợp lệ cho tình trạng hiện tại của đối tượng.

1)
này được cho là không có ý nghĩa trừ khi bạn đang chọn các thiết lập từ một app.config hoặc web.config:

Ngoại lệ ConfigurationException được ném nếu ứng dụng này cố gắng để đọc hoặc ghi dữ liệu vào tệp cấu hình nhưng là không thành công. Một số lý do có thể là vì điều này có thể bao gồm XML không đúng định dạng trong tệp cấu hình, sự cố cấp phép và cấu hình thuộc tính có giá trị không phải là hợp lệ.

2)
Nó không phải là một đối số vì vậy điều này không có ý nghĩa nhiều.

3)
Đây là điều tốt nhất trong ba đối tượng sẽ ở trạng thái không hợp lệ. Tuy nhiên, tùy thuộc vào thiết lập cấu hình của bạn lớn như thế nào, tôi muốn tạo Ngoại lệ của riêng mình bắt nguồn từ System.Exception.

Có hai trường phái về ý tưởng để lấy được từ - System.ExceptionApplicationException *. Hai nhà phát triển khác nhau trong nhóm khung làm việc đã bày tỏ quan điểm khác nhau mà họ nghĩ rằng bạn nên kế thừa từ, tôi gắn bó với Jeffrey Richter's view.

Nếu tất cả các âm thanh trên đều giống như woffle, thì bạn chỉ có thể chọn một video mà bạn cho là có liên quan nhất từ ​​the list.

* Hình như MSDN tại đồng ý với các nhà phát triển khuôn khổ của nó mà ApplicationException là một sai lầm thiết kế

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