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

问题描述 投票:0回答:8

有没有办法装饰一个方法来进行一些日志记录,然后无条件抛出异常?

我有这样的代码:

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." );
}

有什么建议吗?谢谢。

c# .net exception attributes
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...
}

这样编译器就不会抱怨并且你的代码会更加清晰。


2
投票

如果你知道异常总会被抛出,那为什么这很重要。只需将变量设置为 something 即可编译:

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

  x = 0;

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}

2
投票

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

可能不相关,但是示例中使用

out
参数的模式有点奇怪。为什么不在方法上只使用返回类型呢?

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

    MyMethodThatAlwaysThrowsAnException("missed something.");
}


1
投票

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


1
投票

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

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

  // nobody complains about anything

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}

0
投票

它没有回答您的问题,但是当使用 out 参数时,在方法的开头初始化它们总是一个好主意。这样你就不会出现任何编译器错误:

void foo(out int x)
{
    x = 0;
    if( condition() ) { x = bar(); return; }
    MyMethodThatAlwaysThrowsAnException( "missed something." );
}
© www.soinside.com 2019 - 2024. All rights reserved.