2010-07-29 39 views
5

Có thể một đối tượng Ngoại lệ tăng thêm ngoại lệ khác do lỗi nội bộ của nó không?Có thể một đối tượng Ngoại lệ tăng thêm ngoại lệ khác do lỗi nội bộ của nó không?

Giả sử trong try-catch, chúng tôi khởi tạo đối tượng Ngoại lệ, liệu có thể tạo ra một ngoại lệ khác? Nếu có, chúng ta phải lồng các khối try-catch vô cùng trông rất buồn cười.

+0

Bạn có thể làm rõ câu hỏi của mình. Có phải khi ngoại lệ được tạo mới/được tạo không? Là nó trong khối catch? –

+0

Vui lòng xem sửa đổi của tôi ở trên. Cảm ơn bạn. – xport

+1

Bare in mind. Không phải tất cả ngoại lệ đều có thể và sẽ được xử lý. Một số chỉ dẫn cho logic hoặc lỗi không chính xác. –

Trả lời

3

Tóm lại, câu trả lời là có, có thể. Ví dụ - nếu lớp ngoại lệ yêu cầu một đối tượng lớn được khởi tạo dưới dạng một trường, nhưng không đủ bộ nhớ để cấp phát, bạn sẽ nhận được một đối tượng ngoại lệ sẽ ném một số OutOfMemoryException.

Ngoại lệ giống như bất kỳ lớp nào khác và có thể tự ném ngoại lệ. Không có gì trong ngôn ngữ không cho phép nó.

Tôi sẽ nói, tuy nhiên, việc ném ngoại lệ từ một lớp ngoại lệ là thực hành không tốt và nói chung nên tránh.


Cập nhật: (sau câu hỏi được cập nhật)

Nếu bạn đang instantiating một đối tượng ngoại lệ trong một khối try, các catch sẽ bắt nó (giả sử nó bắt kiểu thích hợp ngoại lệ). Nếu bạn đang instantiating nó trong khối catch, bạn có thể muốn làm điều đó trong một lồng nhau try{}catch{} - điều này là khá bình thường đối với mã được sử dụng trong một khối catch có thể ném ngoại lệ.

Như những người khác đã nói - một số trường hợp ngoại lệ không nên bị bắt (ví dụ OutOfMemory hoặc bất ngờ StackOverflow), vì bạn không có cách nào để giải quyết chúng.

+0

Trong trường hợp nào có thể xảy ra? – xport

+0

@xport - Tôi đã đưa ra một ví dụ. Trong mọi trường hợp, bạn có thể tự viết một lớp ngoại lệ và trong đó nó là một ngoại lệ. Ngoại lệ là các lớp đơn giản và tuân theo tất cả các quy tắc của lớp học. – Oded

2

Có - chắc chắn có thể có một ngoại lệ để tăng ngoại lệ.

Tuy nhiên, hầu hết (không phải tất cả) ngoại lệ khung là những thứ khá nhẹ với rất ít logic nội bộ, vì vậy ngoại lệ trung bình có thể không có nhiều phạm vi để tự tạo ngoại lệ.

Đây có phải là ngoại lệ khung mà bạn đang thấy hành vi này không? Bạn có thể cho chúng tôi một số chi tiết không?

Xem nhanh nội bộ ngoại lệ bằng công cụ như Reflector cũng có thể giúp bạn phát hiện ra điều gì, nếu có, đang diễn ra.

1

. Điều này là khả thi.

Nhưng tôi tự hỏi tại sao người ta lại muốn làm điều này? Ngoại lệ chỉ dành cho các lỗi giao tiếp do đó thiết thực theo thiết kế, chúng không thể có bất kỳ mã hoặc logic nghiêm trọng nào chạy trong chúng có thể gây ra ngoại lệ. Nếu bạn là đối số, bạn có thể muốn ghi ngoại lệ vào cơ sở dữ liệu hoặc đĩa có thể gây ra ngoại lệ trong một số điều kiện, sau đó tôi thậm chí không đồng ý với điều đó vì ngoại lệ phải được ghi trong khối catch.

2

Có, nó có thể mặc dù không phải là rất điển hình. Nếu trường hợp ngoại lệ bị ném có lỗi trong hàm tạo hoặc phụ thuộc vào các lớp bị thiếu, thì chính nó sẽ ném một ngoại lệ.

Thật dễ dàng để kiểm tra điều này: tạo ngoại lệ của riêng bạn mà cố gắng gọi phương thức là tham chiếu null. Khi bạn khởi tạo ngoại lệ, nó sẽ ném một NullReferenceException.

1

Nếu bạn đang nghĩ rằng đối tượng ngoại lệ nên cố gắng xử lý tình huống và ném ngoại lệ khác nếu bạn không thể không chính xác.
Khối catch phải xử lý tình huống không chính xác và ném ngoại lệ xa hơn nếu nó không thể làm như vậy.
Ví dụ:

try 
{ 
    BigResource r = new BigResource(); 
} 
catch(BigResourceException e) 
{ 
    bool cannotHandle = false; 
    // Handle exception here 

    if (cannotHandle) 
     throw e; 
} 
Các vấn đề liên quan