2009-12-29 37 views
5

Khi dịch vụ WCF bị tắt, tôi sẽ bắt ngoại lệ này như thế này.Việc cần làm với một ngoại lệ bị bắt

public List<ProjektyEntity> GetProjekty() 
    { 
     try 
     { 
     return this.channel.GetProjekty(); 
     } 
     catch (EndpointNotFoundException exception) 
     { 
      //what to do at this point ? 
     } 
    } 

Nhưng tôi không biết phải làm gì trong bắt block.I có thể trở lại chỉ một đối tượng kiểu List<ProjektyEntity> Tôi muốn viết một tin nhắn cho người sử dụng, một cái gì đó như "Dịch vụ này được tắt "Lớp trình bày của tôi là ASP.NET MVC. Có bất kỳ chiến lược nào cho loại tình huống này không?

Trả lời

15

Có một quy tắc đơn giản: Nếu bạn không biết cách xử lý ngoại lệ, đừng bắt nó.

Chụp và trả lại danh sách trống hoặc danh sách trống sẽ là điều tồi tệ nhất bạn có thể làm vì sẽ khó khắc phục lỗi xảy ra hoặc thậm chí lỗi xảy ra. Nếu bạn làm điều này bạn sẽ có các nhà phát triển kéo tóc ra.

Ghi ngoại lệ và làm lại nó là throw e; cũng không tốt vì bạn mất chồng ban đầu. Rethrowing sử dụng throw; là OK đôi khi nếu bạn có dọn dẹp đặc biệt, bạn chỉ cần thực hiện nếu có lỗi. Thường thì đây không phải là trường hợp. Nếu bạn có dọn dẹp cần được thực hiện có hay không có lỗi, nó thuộc về mệnh đề cuối cùng.

Vì vậy, nói chung trừ khi có điều gì đó hợp lý bạn có thể làm để khôi phục từ lỗi, chỉ cần để cho ngoại lệ propogate cho người gọi. Đây là cách ngoại lệ được thiết kế để hoạt động.

Có một vài lần khi bạn có thể muốn bắt một ngoại lệ để thêm thông tin (ví dụ như đối với khai thác gỗ), trong trường hợp này, bạn nên đảm bảo rằng bạn sử dụng một InnerException để tránh mất thông tin ban đầu:

try 
{ 
    foo(bar); 
} 
catch (Exception e) 
{ 
    throw new FooException("Foo failed for " + bar.ToString(), e); 
} 

nhưng nói chung tốt nhất là không nên làm điều này trừ khi bạn có lý do rất tốt. Làm điều này ngăn cản người dùng của bạn bắt được một loại ngoại lệ cụ thể - họ sẽ bắt ngoại lệ của bạn và sau đó họ cần phải chuyển sang loại InnerException. Không vui. Chỉ cần để người gọi thấy ngoại lệ ban đầu.

+2

Có vẻ như bạn chỉ nên xử lý ngoại lệ này trong lớp trình bày của mình - Ngoại lệ phải đặc biệt. Chỉ xử lý các ngoại lệ nếu bạn có thể theo một đường dẫn logic khác dựa trên ngoại lệ xảy ra. –

4

Dường như với tôi rằng bạn không nên bắt ngoại lệ này ở lớp đó; bạn nên để cho ngoại lệ lan truyền đến lớp điều khiển và để cho lớp điều khiển hiển thị thông báo.

8

Tôi có thể thấy một vài tùy chọn ở đây. Việc xác định cái nào là thích hợp có thể phụ thuộc vào ứng dụng.

  • Hiển thị lỗi và trả về giá trị rỗng. Sạch sẽ và đơn giản nhưng không linh hoạt. Có thể không phải là những gì bạn muốn trong mọi trường hợp mà chức năng này được sử dụng.
  • Đừng bắt nó, hãy để người gọi bắt ngoại lệ này. Có thể dễ dàng xác định phản hồi thích hợp hơn từ chức năng gọi (ví dụ: hiển thị tin nhắn/thử lại sau vài giây/lần)
  • Chụp và ném ServiceNotAvailableException mới Hơi phức tạp hơn tùy chọn hai, nhưng sẽ làm cho mã của bạn rõ ràng hơn.
  • Chỉ cần trả về giá trị rỗng. Có lẽ là cách tiếp cận ít được mong đợi nhất trừ khi dịch vụ này không hoạt động phổ biến và không có vấn đề gì lớn.
1

Tạo một đối tượng ngoại lệ với đủ chi tiết gỡ lỗi và ném nó để gọi phương thức

2

Trường hợp ngoại lệ là không được phép bị bắt và xử lý trong bối cảnh này. Nó cần phải được xử lý ở mức cao hơn nhiều khi có quyền truy cập vào bất kỳ giao diện điều khiển nói chung.

Điều tốt nhất bạn có thể làm ở đây chỉ là ghi lại ngoại lệ với các chi tiết cần thiết và quay lại đúng cách.

4

Có một số phương pháp:

1) Đừng bắt ngoại lệ, và để cho người gọi (user interface layer) xử lý nó

2) Catch the ngoại lệ, do đó bạn có thể làm bất cứ điều gì bạn cần để làm, và sau đó lại ném nó

catch (EndpointNotFoundException exception) 
{ 
    CleanUpMyOwnState(); 
    throw;     // Pass the exception on the to the caller to handle 
} 

3) Chuyển đổi các ngoại lệ vào loại khác (để làm cho nó dễ dàng hơn để xử lý trong người gọi):

catch (EndpointNotFoundException exception) 
{ 
    CleanUpMyOwnState(); 
    throw new InvalidOperationException("Endpoint was not found", exception); 
} 

4) bắt nó, và sau đó trả về một mã lỗi (ví dụ null), vì vậy người gọi không cần phải sử dụng xử lý ngoại lệ để đối phó với nó (nhưng không có lợi thế thực sự để làm điều này)

5) Bắt ngoại lệ và báo cáo lỗi cho chính người dùng đó. Đây có lẽ là một ý tưởng tồi - bạn nên giữ tất cả các báo cáo lỗi trong lớp UI của bạn.

0
public List<ProjektyEntity> GetProjekty() 
    { 
     try 
     { 
     return this.channel.GetProjekty(); 
     } 
     catch (EndpointNotFoundException exception) 
     { 
      'Write here Some Clean Up Codes 
      ' Log it somewhere on your server so that you can fix the error 

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