首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态构造函数中出现异常

静态构造函数中出现异常
EN

Stack Overflow用户
提问于 2011-01-20 00:28:40
回答 3查看 20.5K关注 0票数 42

我到处寻找这个问题的答案,到目前为止,我能找到的最好的答案是

这里

然而,这是针对具有静态构造函数的实例的;我只是静态地使用这个类。

我的代码:

代码语言:javascript
运行
复制
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样式。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-20 00:34:44

另外两个答案很好地回答了你的直接问题-这里是一个元答案-当你检测到配置元素没有被填充时,你应该在方法中抛出异常,而不是在构造函数中。在构造函数阶段,“未配置”是这些元素的有效配置状态,只是在SendMail时不是。这将回避整个问题。

票数 25
EN

Stack Overflow用户

发布于 2011-01-20 00:31:50

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

演示:

代码语言:javascript
运行
复制
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);
            }
        }
    }
}

输出:

代码语言:javascript
运行
复制
In static constructor
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException

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

票数 98
EN

Stack Overflow用户

发布于 2011-01-20 00:32:40

来自

Microsoft文档

(静态构造函数(C#编程指南)):

如果静态构造函数引发异常,运行库将不会再次调用它,并且该类型将在程序运行所在的应用程序域的生存期内保持未初始化状态。最常见的是,一个

TypeInitializationException

当静态构造函数无法实例化类型或静态构造函数中发生未处理的异常时,将引发。对于未在源代码中显式定义的隐式静态构造函数,故障排除可能需要检查中间语言(IL)代码。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4737875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档