Kiểm tra .NET Exception đã được Catch ở dll

Tình huống: Khi ta sử dụng 1 số thư viện dll mà chúng ta không có mã nguồn. có thể sẽ gặp phải tình huống trong dll bị try catch. Lúc này ứng dụng của ta có thể xảy ra lỗi mà không biết được nguyên nhân vì không thấy lỗi. Ví dụ:
Ta có MyLib.dll, giả sử source của nó thế này. Nhưng ta sẽ chỉ có dll và không biết trong source làm gì

/// <summary>
/// This MyLib project is transparent from MyApp
/// Developer of MyApp can only access MyLib.dll
/// </summary>
namespace MyLib
{
    public class MyComponent
    {
        public void Execute(Action callback)
        {
            try {
                //may be the callback will be passed from inherited delegate/event or another classes
                callback();
            } catch(Exception ex){
                //may be they have place a messagebox or even nothing
                //Console.WriteLine(ex.Message);
            }
        }
    }
}

Và đây là project console MyApp sử dụng MyLib.dll

namespace MyApp
{
    class Program
    {
        static void Main(string[] args)
        {
            new MyLib.MyComponent().Execute(() => {
                //do something that may be throw an exception
                //but this exception is hidden
                throw new Exception("Exception occurred!!!");
            });
            Console.WriteLine("Finished!");
        }
    }
}

Kết quả khi chạy là sẽ không có dialog hay message nhận biết là trong Execute callback ta vừa viết có xảy ra lỗi để sửa.
Thực tế, tình huống có thể rất phức tạp hơn bởi kế thừa, lớp này gọi lớp khác…Visual studio có công cụ intellitrace để hỗ trợ debug mạnh mẽ nhưng chỉ có ở bản enterprise. Có những lỗi chỉ xảy ra khi chạy ở môi trường production. Còn việc decompile dll rất mất thời gian.

Xử lý:
Ta dùng sự kiện FirstChanceException của AppDomain:

        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.FirstChanceException += (source, e) => {
                Console.WriteLine(e.Exception);
            };
            new MyLib.MyComponent().Execute(() => {
                //do something that may be throw an exception
                //but this exception is hidden
                throw new Exception("Exception occurred!!!");
            });
            Console.WriteLine("Finished!");
        }

2017-02-16-08_39_25-c__windows_system32_cmd-exe
Sự kiện này sẽ xảy ra trước khi Exception được throw như là 1 dạng notification (nhưng chỉ đối với managed code)

Nếu bạn muốn làm tương tự như thế đối với .NET Core, chúng ta phải chờ phiên bản 1.2 có thể release trong Q1/Q2 năm 2017

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s