2010-03-03 32 views
8

Tôi yêu cầu điều này từ sự tò mò hơn là do nhu cầu thực sự cần biết, nhưng tôi không thể nghĩ ra bất kỳ lý do chính đáng nào cho MethodInfo.Invoke để bao gồm các ngoại lệ của nó.Tại sao MethodInfo.Invoke bọc ngoại lệ trong một TargetInvocationException?

Được để cho họ vượt qua unwrapped, gỡ lỗi ngoại lệ như vậy trong Visual Studio sẽ là một chút dễ dàng hơn - Tôi sẽ không phải yêu cầu VS dừng lại trên cơ sở đầu tiên ngoại lệ để xem trạng thái hiện tại tại nguồn ngoại lệ . Dấu vết ngăn xếp có lẽ sẽ hiển thị [mã bên ngoài] ngay sau khi gọi tới số Invoke, nhưng vậy thì sao.

Tôi có thiếu một số chức năng quan trọng mà gói này cung cấp mà sẽ không thể có được Invoke cho phép ngoại lệ vượt qua chưa được xóa?

+1

Nếu bạn muốn gọi phương thức động mà không có ngoại lệ được bao bọc, tôi đã tìm ra cách để làm điều này và viết blog về nó. http://timwi.blog.com/2010/03/12/dynamic-invoke/ – Timwi

Trả lời

9

Tôi có thiếu một số chức năng quan trọng rằng gói này quy định rằng sẽ không thể đã Invoke để ngoại lệ vượt qua tháo?

Có. Một đối số là có thể phân biệt giữa ngoại lệ ném bởi phương pháp đích và ngoại lệ được ném bởi chính cơ chế phản chiếu. Ví dụ các ArgumentException có thể được ném từ cơ chế phản chiếu hoặc phương pháp đích - đây là hai cấp meta khác nhau.

Đối số khác là hợp đồng của phương thức invoke chính nó. Trong Java, phương thức invoke chỉ được phép ném ngoại lệ được khai báo trong chữ ký phương thức. Ngoại lệ tùy ý đơn giản là sẽ không tuân theo chữ ký và cần phải được bọc lại. Đối số này không giữ nguyên C#, nhưng vẫn hợp lệ. Phương thức invoke có hợp đồng được xác định trong tài liệu mà bạn không thể dựa vào, nếu ngoại lệ đích được ném như cũ.

+4

Đối số đầu tiên của bạn hơi thô. Điều này có nghĩa là tất cả các phương thức nên bao gồm các ngoại lệ từ các cuộc gọi đến các phương thức khác để phân biệt chúng. Có các cơ chế để xem vị trí ngoại lệ xuất phát từ: Nếu Invoke tự ném, dấu vết ngăn xếp sẽ trỏ vào mã M $. Ngoài ra loại ngoại lệ cho một gợi ý. – mmmmmmmm

-1

Nếu có một tình huống, nơi mà TargetInvocationException có thể được ném mà không có phương pháp gọi và ném ngoại lệ, nó có ý nghĩa. Tôi không chắc chắn nếu có một trường hợp như vậy.

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