当前位置:  开发笔记 > 编程语言 > 正文

提出一种通用方法在FAIL上抛出特定的异常类型

如何解决《提出一种通用方法在FAIL上抛出特定的异常类型》经验,为你挑选了2个好方法。

是的,我知道我会完全看起来像这个白痴,但我的大脑今天早上并没有开始装备.

我想要一个方法,我可以说"如果它变坏了,请回到这种类型的异常",对吧?

例如,类似的东西(这不起作用):

    static ExType TestException(string message) where ExType:Exception
    {
        Exception ex1 = new Exception();
        ExType ex = new Exception(message);
        return ex;
    }

现在让我感到困惑的是,我们知道泛型类型由于where子句而属于Exception类型.但是,代码失败是因为我们无法隐式地将Exception 强制转换ExType.我们也无法明确转换它,例如:

    static ExType TestException(string message) where ExType:Exception
    {
        Exception ex1 = new Exception();
        ExType ex = (ExType)(new Exception(message));
        return ex;
    }

因为那也失败了......那么这种事情可能吗?我有一种强烈的感觉,它会变得非常简单,但是我和老头脑一起度过了艰难的一天,所以让我有些松懈:P


更新

感谢回复的人,看起来我不是一个完全白痴!;)

好的,所以Vegard和Sam让我能够实例化正确的类型,但显然卡住了,因为消息参数在实例化后是只读的.

Matt用他的回答击中了正确的指甲,我​​测试了这一切,一切正常.这是示例代码:

    static ExType TestException(string message) where ExType:Exception, new ()
    {
        ExType ex = (ExType)Activator.CreateInstance(typeof(ExType), message);
        return ex;
    }

甜!:)

多谢你们!



1> Matt Hamilto..:

你几乎可以这样做:

static void TestException(string message) where E : Exception, new()
{
    var e = new E();
    e.Message = message;
    throw e;
}

但是,这不会编译,因为Exception.Message是只读的.它只能通过将它传递给构造函数来赋值,并且没有办法用非默认构造函数来约束泛型类型.

我认为你必须使用反射(Activator.CreateInstance)来使用message参数"new up"自定义异常类型,如下所示:

static void TestException(string message) where E : Exception
{
    throw Activator.CreateInstance(typeof(E), message) as E;
}

编辑哎呀刚刚意识到你想要返回异常,而不是抛出异常.同样的原则适用,所以我将把我的答案保留为throw语句.



2> samjudson..:

解决方案的唯一问题是可以创建Exception的子类,它不实现具有单个字符串参数的构造函数,因此可能抛出MethodMissingException.

static void TestException(string message) where E : Exception, new()
{
    try 
    {
      return Activator.CreateInstance(typeof(E), message) as E;
    } 
    catch(MissingMethodException ex) 
    {
      return new E();
    }
}

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有