当第一次使用一个类的时候,
会先调用这个类的静态构造函数,
而在静态构造函数中发生异常,
为什么我捕捉不到。请问应该如何捕捉到这个异常??

解决方案 »

  1.   

    系统并不是第一次使用类的方法时调用静态构造函数
    只是保证在第一次使用时已进行初使化,因此你无法在程序中捕捉。因为它比任何代码运行都早。
    同意楼上的用Application.ThreadException
    应该是可以捕获静态构造器的异常
      

  2.   

    Application.ThreadException我已经试过了,
    不过静态构造函数中发生的异常,不会激发这个事件。
      

  3.   

    To Knight94(愚翁):
       谢谢你的提示!   在静态构造函数中能够catch到异常,那么在类外怎么能知道发生了异常,
       难道还要做一个事件,在静态构造函数的catch中激发这个事件?
       这样是能够实现的。不过,我想知道静态构造函数的原理,它把异常句柄给了谁?
      

  4.   

    to 在静态构造函数中能够catch到异常,那么在类外怎么能知道发生了异常其实你把构造函数作为静态的,就应该尽量避免构造函数出现异常,或者说把容易出现异常的部分不应该放到静态构造函数当中。
      

  5.   

    To Knight94(愚翁):
       再次感谢你的迅速解答!   其实你把构造函数作为静态的,就应该尽量避免构造函数出现异常,
       或者说把容易出现异常的部分不应该放到静态构造函数当中。
                        ---- 这只能说是一个对策,其原理能否给分析一下?
      

  6.   

    public class Test
    {
        protected static string _name;
        protected static string _assemblyPath;
        public static string Name
        {
            get {return _name;}
        }

        static Test()
        {
            _name = "XXX";
            //这里想实现一些对资源的初期化,有可能发生异常,用以下代码模拟异常
            throw new Exception("static exception");
        }
    }public class Starter()
    {
        public static void Main()
        {
            try
            {
                System.Console.WriterLine(Test.Name);
            }
            catch {}
        }
    }这是我的测试程序,请问对于static构造函数的异常就没有办法了吗?
      

  7.   

    这是我的测试程序,请问对于static构造函数的异常就没有办法了吗?
    --------------
    更定有办法.....静态构造函数我竟然还每用过.....关注一下.
      

  8.   

    to 这是我的测试程序,请问对于static构造函数的异常就没有办法了吗?如果你了解静态构造函数什么会被调用,就不难理解捕获它的异常有多难。
      

  9.   

    类的静态构造函数在给定应用程序域中至多执行一次;
    只有创建类的实例或者引用类的任何静态成员才激发静态构造函数;
    如果类中包含用来开始执行的Main方法,则该类的静态构造函数将在调用Main方法之前执行。这些我都知道,可还是不能理解:
    我在代码中只有 System.Console.WriterLine(Test.Name);
    这是第一次访问Test类,
    那么不就是这个时候调用静态构造函数,
    那么此时我怎么就捕捉不到异常呢?
      

  10.   

    class Program
    {
    static void Main(string[] args)
    { try
    {
    Console.WriteLine(a.B);
    }
    catch

    Console.WriteLine("捕捉到异常");
    }
    Console.ReadLine();
    }
    }
    class a
    {
    static string b;
    public static string B
    {
    get { return b; }
    }
    static a()
    {
    throw new System.Exception();
    }
    }
    可以捕捉啊
      

  11.   

    大家就运行 sooob() 老兄写的代码,会有个未处理的异常class Program
    {
    static void Main(string[] args)
    {try
    {
    Console.WriteLine(a.B);
    }
    catch

    Console.WriteLine("捕捉到异常");
    }
    Console.ReadLine();
    }
    }
    class a
    {
    static string b;
    public static string B
    {
    get { return b; }
    }
    static a()
    {
    throw new System.Exception();
    }
    }
      

  12.   

    try
    .....
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
    ......
    static void MyHandler(object sender, UnhandledExceptionEventArgs args) {
       Exception e = (Exception) args.ExceptionObject;
       Console.WriteLine("MyHandler caught : " + e.Message);
    }
      

  13.   

    我在代码中只有 System.Console.WriterLine(Test.Name);
    这是第一次访问Test类,
    那么不就是这个时候调用静态构造函数,
    那么此时我怎么就捕捉不到异常呢?
    ——————————————————————————应该在这之前就已经执行静态构造函数了
      

  14.   

    静态构造函数中抛出异常时,CLR会对该异常进行进一层的包装,
    所以我们catch到的异常的InnerException才是静态构造函数抛出的异常。MS网站上一篇讲静态构造函数的文章:
    http://msdn.microsoft.com/msdnmag/issues/05/01/StaticsinNET/default.aspx