有没有办法装饰一个方法来进行一些日志记录,然后无条件抛出异常?
我有这样的代码:
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." );
}
有什么建议吗?谢谢。
这个怎么样?
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);
}
这是一个非常古老的线程,但我只是想补充一点,你应该从头开始写它:
void foo(out int x)
{
if (!condition())
MyMethodThatAlwaysThrowsAnException("missed something.");
x = bar();
// and so on...
}
这样编译器就不会抱怨并且你的代码会更加清晰。
如果你知道异常总会被抛出,那为什么这很重要。只需将变量设置为 something 即可编译:
void foo(out int x)
{
if( condition() ) { x = bar(); return; }
x = 0;
MyMethodThatAlwaysThrowsAnException( "missed something." );
}
无法以这种方式标记方法。
可能不相关,但是示例中使用
out
参数的模式有点奇怪。为什么不在方法上只使用返回类型呢?
int Foo()
{
if (condition()) return bar();
MyMethodThatAlwaysThrowsAnException("missed something.");
}
要将方法标记为始终抛出,您可以使用
[DoesNotReturn]
属性。
x
是一个 out 参数,必须在继续之前设置
如果您不想设置 x,为什么不直接使用 ref 参数呢?
void foo(ref int x)
{
if( condition() ) { x = bar(); return; }
// nobody complains about anything
MyMethodThatAlwaysThrowsAnException( "missed something." );
}
它没有回答您的问题,但是当使用 out 参数时,在方法的开头初始化它们总是一个好主意。这样你就不会出现任何编译器错误:
void foo(out int x)
{
x = 0;
if( condition() ) { x = bar(); return; }
MyMethodThatAlwaysThrowsAnException( "missed something." );
}