方法抛出错误而不是返回null。为什么?

3

有时我会遇到一个错误

There is not a header with name UserName and namespace http://www.website.com/ in the message.

堆栈跟踪

System.ServiceModel.Channels.MessageHeaders.GetHeader[T](String name, String ns, String[] actors) Common.Utilities.WCF.WcfCallContext.TryGetHeader(String key) Common.Utilities.WCF.WcfCallContext.get_UserName()

以下是两个方法:

    private static string TryGetHeader( string key )
    {
        try
        {
            return GetHeader( key );
        }
        catch
        {
            return null;
        }
    }

    private static string GetHeader( string key )
    {
        var headers = OperationContext.Current.IncomingMessageHeaders;
        var value = headers.GetHeader<string>( key, "http://www.website.com/", "Project" );
        return value;
    }
}

所以使用TryGetHeader(带有try和catch)会调用GetHeader。显然,它会在此处中断:
var value = headers.GetHeader<string>( key, "http://www.website.com/", "Project" );

为什么TryGetHeader没有将其作为错误捕捉并返回null呢? 好像它在GetHeader中出现了问题,停止了运行,而不是在TryGetHeader中抛出错误?

1
似乎使用FindHeader,然后(对于值> -1)应用索引操作可以防止它抛出任何异常。您不应编写依赖于特定异常被抛出的代码(特别是如果您随后捕获所有异常,而不仅仅是预期的异常)。 - Damien_The_Unbeliever
1
你尝试过不使用调试运行代码吗? - Leri
4
这个错误实际上是被你自己的代码捕获/未处理,还是仅在调试器中显示出来? - Medinoc
Medinoc提出了一个公正的观点。那是否真的破坏了你的代码? - Gusdor
1个回答

6
如果您调用TryGetHeader,那么该异常将被捕获。我强烈怀疑您看到的是“第一次机会异常”,或者在IDE/调试器中看到了异常。这是一个幻象:异常实际上并不存在(或者说,在正常执行中它将被捕获)。尝试降低IDE中的异常处理选项。

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