捕获或引发的类型必须从System.Exception派生

本文关键字:System Exception 派生 类型 | 更新日期: 2023-09-27 17:57:32

以下代码中是否需要约束来解决上述编译器错误:

private T GetResponse<T, TError>(HttpResponseMessage response)
{
    if (response.IsSuccessStatusCode)
    {
        return response.Content.ReadAsAsync<T>().Result;
    }
    else
    {
        if (response.StatusCode == HttpStatusCode.BadRequest)
        {
            var ex = response.Content.ReadAsAsync<TError>().Result;
            throw ex;
        }
    }
    throw new NotImplementedException();
}

我将以上内容如下:

public int MyMethod(string param)
{
    var response = client.PostAsJsonAsync(url, param).Result;
    return GetResponse<int, MyException>(response);
}

MyException确实是从System.Exception派生的,但是我得到了上面的编译器错误。是否需要约束?

捕获或引发的类型必须从System.Exception派生

将方法更改为:

private T GetResponse<T, TError>(HttpResponseMessage response) where TError : Exception

是的,throw语句要求类型从Exception派生。约束可以解决这个问题。

private T GetResponse<T, TError>(HttpResponseMessage response)
    where TError : Exception

where TError : Exception添加到方法定义中。

编译时,不清楚ex是否真的是异常。编译器只知道它是TError类型,它可以实现也可以不实现Exception。尽管您在调用GetResponse<int, MyException>(response)时提供了类型,但编译器不可能使TError在所有方面都是该给定类型的,因此的泛型方法中根本不知道该类型。如果你要写GetResponse<int, MyType>(response)之类的东西,编译器应该怎么做?

由于throw-语句需要Excpetion的实例,您将需要TError的类型约束,正如您已经设想的那样。