簡體   English   中英

pt 2,無法捕捉的例外

[英]The uncatchable exception, pt 2

更新:我已經在Microsoft Connect上提交了錯誤報告: https//connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details

如果您可以在您的機器上重現此問題,請提供錯誤,以便修復它!


好的,我已經做了一些測試,我把問題簡化為非常簡單的事情:

一世。 在拋出異常的新類中創建方法:

public class Class1 {
    public void CallMe() {
        string blah = null;
        blah.ToLower();
    }
}

II。 創建一個MethodInfo,在其他地方指向此方法:

Type class1 = typeof( Class1 );
Class1 obj = new Class1();
MethodInfo method = class1.GetMethod( "CallMe" );

III。 在try / catch塊中包含對Invoke()的調用:

try {
    method.Invoke( obj, null ); // exception is not being caught!
} catch {
}

IV。 沒有調試器運行程序(工作正常)。

v。現在使用調試器運行程序。 發生異常時,調試器將暫停程序,即使它包含在試圖忽略它的catch處理程序中。 (即使你在catch塊中放置了一個斷點,它會在它到達之前停止!)

實際上,在沒有調試器的情況下運行它時會發生異常。 在一個簡單的測試項目中,它在某個其他級別被忽略,但如果您的應用程序有任何類型的全局異常處理,它也會在那里被觸發。 [看評論]

這讓我很頭疼,因為它一直在觸發我的應用程序的崩潰處理程序,更不用說嘗試調試的痛苦了。

我可以在我的.NET 4機器上重現這一點,你說得對 - 它只發生在.NET 4.0上。

這對我來說非常像臭蟲,應該繼續使用MS Connect。 如果這是絆倒你的崩潰處理程序,那么主要是糟糕的。 聽起來像解決這個問題的一種不愉快的方法是將調用的方法包裝在自己的處理程序中。 :-(

但是,我無法重現的一件事是絆倒崩潰處理程序。 這是我的計划:

namespace trash {
    public class Class1 {
        public void CallMe() {
            string blah = null;
            blah.ToLower();
        }
    }

    class Program {
        static void Main(string[] args) {
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);           
            var class1 = typeof(Class1);
            var method = class1.GetMethod("CallMe");

            try {
                var obj = new Class1();
                method.Invoke(obj, null); // exception is not being caught!
            }
            catch (System.Reflection.TargetInvocationException) {
                Console.Write("what you would expect");
            }

        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
            Console.Write("it would be horrible if this got tripped but it doesn't!");
        }
    }
}

你不能抓住所有例外。 您的示例中有一些假設。 例如,您假設在調用線程上引發了異常。 在其他線程上捕獲未處理的異常取決於您正在使用的運行時(console,winforms,WPF,ASP.Net等)。

此外,對System.Environment.FailFast()的調用不會生成任何可處理的條件 - 該進程實際上已終止,無法進行干預。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM