Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何捕获正确的异常?_C# - Fatal编程技术网

C# 如何捕获正确的异常?

C# 如何捕获正确的异常?,c#,C#,我有下面的方法。只要myResult变量为空,我就会得到一个500的内部服务器 错误。各种场景可能会使myResult为空 如何捕获正确的异常而不是500内部服务器错误 try { var myResult = await _myRepository.GetDataAsync(Id); if (!myResult.Any()) {

我有下面的方法。只要myResult变量为空,我就会得到一个500的内部服务器 错误。各种场景可能会使myResult为空

如何捕获正确的异常而不是500内部服务器错误

            try
            {
                var myResult = await _myRepository.GetDataAsync(Id);

                if (!myResult.Any())
                {
                    throw new ArgumentException("Unable to retrieve record");
                }

            return myResult;                   
            }
            catch (HttpProxyException ex)
            {
                string errorMessage = ex.Message.ToString();
                throw new ArgumentException(errorMessage);
            }

我怀疑您的
\u myRepository.GetDataAsync(Id)
引发HttpProxyException。因此,您无法检查
myResult
是否为空,因为错误会提前抛出

您可以按如下方式调整代码:

var myResult;

try
{
    myResult = await _myRepository.GetDataAsync(Id);
catch (HttpProxyException ex)
{
    string errorMessage = ex.Message.ToString();
    throw new ArgumentException(errorMessage);
}

if (!myResult.Any())
{
    throw new ArgumentException("Unable to retrieve record");
}

return myResult;

在这种情况下,只有当您尝试获取数据但收到错误时,才会抛出500内部服务器错误。如果成功获得结果但没有数据,则抛出自定义异常。

目前,代码将只捕获
HttyPRoxyException
类型异常。这样您的
ArgumentException
异常就不会被捕获

但是您可以有多个catch子句来处理不同的异常类型。它们按照从第一个到最后一个的顺序进行计算,第一个具有匹配签名的将处理它

例如,您可以使用

        try
        {
            var myResult = await _myRepository.GetDataAsync(Id);

            if (!myResult.Any())
            {
                throw new ArgumentException("Unable to retrieve record");
            }

            return myResult;                   
        }
        catch (HttpProxyException ex)
        {
            string errorMessage = ex.Message.ToString();
            throw new ArgumentException(errorMessage);
        }
        catch (ArgumentException ex)
        {
            //Do something different here;
        }
如果需要,您还可以在末尾放置一个泛型catch来捕获任何其他异常类型

        catch (Exception ex)
        {
            //Do whatever;
        }
注意:需要注意的一点是,通过在Catch中抛出一个新异常,您将丢失先前的堆栈跟踪。这会使精确定位违规代码的确切位置变得更加困难

帮助解决此问题的一种方法是将原始异常包括在新异常中,即

    catch (HttpProxyException ex)
    {
        string errorMessage = ex.Message.ToString();
        throw new ArgumentException(errorMessage, ex);
    }

检查内部异常?这可能有实际的异常。我怎么做?问题是我在哪里抛出这个异常,它没有在它的方法中命中catch块。它将返回到在控制器中调用它的catch块。如果您不知道如何检查异常,请停止正在执行的操作并学习基本的编程课程。相信我,这会让你的生活更轻松。