如何标记一个方法将无条件抛出异常?

10

有没有一种方法可以装饰一个函数,记录一些日志,然后无条件抛出异常?像下面这样:

我有这样的代码:

void foo(out int x)
{
  if( condition() ) { x = bar(); return; }

  // notice that x is not yet set here, but compiler doesn't complain

  throw new Exception( "missed something." );
}

如果我这样写,就会出现问题:

void foo(out int x)
{
  if( condition() ) { x = bar(); return; }

  // compiler complains about x not being set yet

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}

有什么建议吗?谢谢。

你遇到了什么问题? - Chris Ballance
方法结束时,x具有out属性但尚未设置。 - k0dek0mmand0
1
我有点困惑——如果当 x 被设置(并且进行了返回)时它没有被抛出,那么它是如何无条件地被抛出的呢? - Matt
我想将MyMethodThatAlwaysThrowsAnException标记为一个总是抛出异常的方法,而不是foo方法。 - k0dek0mmand0
这个回答解决了你的问题吗?声明一个方法总是抛出异常? - MuiBienCarlota
显示剩余5条评论
8个回答

21

这个怎么样?

bool condition() { return false; }
int bar() { return 999; }
void foo(out int x)
{
    if (condition()) { x = bar(); return; }
    // compiler complains about x not being set yet 
    throw MyMethodThatAlwaysThrowsAnException("missed something.");
}
Exception MyMethodThatAlwaysThrowsAnException(string message)
{
    //this could also be a throw if you really want 
    //   but if you throw here the stack trace will point here
    return new Exception(message);
}

4

这是一个很老的帖子,但我想补充一下,你应该从一开始就写得不同:

void foo(out int x)
{
    if (!condition()) 
        MyMethodThatAlwaysThrowsAnException("missed something.");

    x = bar();
    // and so on...
}

那样编译器就不会报错,你的代码更加清晰易懂。


实际的代码可能更加复杂,因此您的建议可能没有意义。 - avl_sweden

2

如果你知道异常总是会被抛出,那么这有什么关系呢?只需将变量设置为something,使其能够编译即可:

void foo(out int x)
{
  if( condition() ) { x = bar(); return; }

  x = 0;

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}

3
那正是我想要避免做的事情。 :) - k0dek0mmand0

2

无法以这种方式标记方法。

可能与此无关,但您示例中的模式使用 out 参数有点奇怪。为什么不在方法上直接使用返回类型呢?

int Foo()
{
    if (condition()) return bar();

    MyMethodThatAlwaysThrowsAnException("missed something.");
}

那只是一个简单的例子。实际代码相当复杂。 - k0dek0mmand0
@k0dek0mmand0:我怀疑可能是这种情况。我想你运气不好 - 没有办法告诉编译器MyMethodThatAlwaysThrowsAnException总是会抛出异常。 - LukeH

1

如果您不想设置x,为什么不使用ref参数呢?

void foo(ref int x)
{
  if( condition() ) { x = bar(); return; }

  // nobody complains about anything

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}


1

x 是一个输出参数,在继续之前必须设置它


3
除非出现异常。 - k0dek0mmand0
1
仍然是良好的策略,确保在方法早期设置任何输出参数并为其分配默认值(如果未设置)。 - Chris Ballance

0

这并不回答你的问题,但是在使用输出参数时,最好在方法开始时初始化它们。这样你就不会有任何编译器错误:

void foo(out int x)
{
    x = 0;
    if( condition() ) { x = bar(); return; }
    MyMethodThatAlwaysThrowsAnException( "missed something." );
}

4
我认为应该在有意义的地方或者可能会防止一些隐藏的编译时错误的情况下分配输出参数,因为你可能会忘记在某些代码路径上分配输出参数。 - Dzmitry Huba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接