c# - 静态构造函数中的异常

标签 c# exception constructor static-classes

我已经四处寻找答案,到目前为止我能找到的最好的答案是 here ,但是这是针对具有静态构造函数的实例;我只是静态地使用这个类。

我的代码:

public static class MailHelper {

    private static string mailHost;

    static MailHelper() {

        var mailSettings = ConfigurationManager.GetSection("MailSettings") as NameValueCollection;
        if (null == mailSettings) {
            throw new ConfigurationErrorsException("Missing Mail Settings in the configuration file");
        }

        mailHost = ConfigurationManager.AppSettings["mailHost"];
        if (null == mailHost) {
            throw new ConfigurationErrorsException("Missing mailHost setting in the configuration file");
        }

    }

    public static void SendMail(MailMessage Message) {
        ...
    }

}


try {
    MailHelper.SendMail(Message);
}
catch (ConfigurationErrorsException exc) {
    ...
}

//  ???    
MailHelper.SendMail(Message);


.

因此,如果静态构造函数在第一次调用时抛出异常,那么当我第二次尝试访问静态 SendMail() 方法时会发生什么?

PS:很抱歉,如果您不喜欢 Stroustrup 版本的 K&R 牙套样式,但不要只是为了将牙套更改为您喜欢的 Allman 样式而编辑我的帖子。谢谢。

最佳答案

一旦类型初始值设定项失败一次,就永远不会重试。该类型在 AppDomain 的生命周期内是死的。 (请注意,这适用于所有类型初始化器,而不仅仅是具有静态构造函数的类型。具有带有初始化器表达式的静态变量但没有静态构造器的类型可能会在类型初始化器执行的时间上表现出细微的差异 - 但它会仍然只发生一次。)

演示:

using System;

public sealed class Bang
{
    static Bang()
    {
        Console.WriteLine("In static constructor");
        throw new Exception("Bang!");
    }

    public static void Foo() {}
}

class Test
{
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            try
            {
                Bang.Foo();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.GetType().Name);
            }
        }
    }
}

输出:

In static constructor
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException

如您所见,静态构造函数只被调用一次。

关于c# - 静态构造函数中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4737875/

相关文章:

objective-c - 在 prepareForSegue 期间获取 [UIViewController <null selector>] 时尝试将值分配给属性?

java - 尝试创建一个构造函数,该构造函数将使用参数中给出的数字初始化 'number' 并设置长度

c++是在参数化构造函数中调用的默认构造函数吗?

java - 从构造函数调用可覆盖方法的问题

c# - 将上下文菜单绑定(bind)到 View 模型属性

c# - C# 中需要某种创建模式

c++ - 抛出静态类型的理由?

java - 我的代码在 Netbeans 中运行良好,但在运行 jar 时抛出异常

c# - 未调用 ICollectionView 过滤器

c# - 以编程方式将控件放置在 div 中