相关疑难解决方法(0)

C#函数是否有标准的"永不返回"属性?

我有一个看起来像这样的方法:

void throwException(string msg)
{
    throw new MyException(msg);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我写

int foo(int x, y)
{
    if (y == 0)
        throwException("Doh!");
    else
        return x/y;
}
Run Code Online (Sandbox Code Playgroud)

编译器会抱怨foo"并非所有路径都返回一个值".

是否有一个属性我可以添加到throwException以避免这种情况?就像是:

[NeverReturns]
void throwException(string msg)
{
    throw new MyException(msg);
}
Run Code Online (Sandbox Code Playgroud)

我担心自定义属性不会这样做,因为为了我的目的,我需要编译器的合作.

c# attributes exception return-type

30
推荐指数
5
解决办法
3528
查看次数

我什么时候应该使用ThrowHelper方法而不是直接投掷?

什么时候使用ThrowHelper方法而不是直接投掷?

void MyMethod() {
    ...
    //throw new ArgumentNullException("paramName");
    ThrowArgumentNullException("paramName");
    ...
}
void ThrowArgumentNullException(string paramName) {
    throw new ArgumentNullException(paramName);
}
Run Code Online (Sandbox Code Playgroud)

我已经读过调用一个ThrowHelper方法(一个抛出异常的唯一方法)而不是直接抛出应该产生更小的字节码.

这个以及明显的封装(另一层间接)可能是不直接抛出的好理由,至少在某些情况下是这样.

无论如何,IMO的缺点也不是没有实质性的.

  • (异常)控制流程的一部分是隐藏的
  • 异常最终会产生更加神秘的堆栈跟踪
  • 编译器(2.0)不会识别ThrowHelper调用是方法的退出点,因此需要一些代码.

我有限的经验是整体设计经常变得更糟.

int MyMethod(int i) {
    switch (i) {
        case 1:
            return 1;
        default:
            ThrowMyException();
    }
    return 0; // Unreachable (but needed) code
 }
Run Code Online (Sandbox Code Playgroud)

这可能部分是个人品味的问题.无论如何,你对这个问题有什么个人指导?您是否发现将ThrowHelpers用于所有常见任务(如方法参数验证(ThrowArgumentNullException(paramName)等)是个好主意?我在这个问题上遗漏了哪些明显的东西?

顺便说一下,我试图不将此问题与验证问题混在一起,例如:

ThrowIfNameIsNullOrEmpty(name);
Run Code Online (Sandbox Code Playgroud)

c# exception throw

14
推荐指数
3
解决办法
4421
查看次数

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

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

我有这样的代码:

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." );
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样写,我会遇到问题:

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

  // compiler complains about x not being set yet

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?谢谢.

.net c# attributes exception-handling

10
推荐指数
1
解决办法
2540
查看次数