gpt4 book ai didi

exception-handling - 如何处理 IQueryable<> 方法中的后端异常?

转载 作者:行者123 更新时间:2023-12-03 23:41:24 43 4
gpt4 key购买 nike

使用 HttpClient 调用 ASP.NET Web API 方法、调用 EF 存储库的场景。
我在捕获 SQL 异常时遇到了问题。

客户:

try
{
var client = new HttpClient();
var httpRequestMessage = new HttpRequestMessage();
var response = await client.SendAsync(httpRequestmessage);
response.EnsureSuccessStatusCode();
}
catch (Exception ex)
{
// internal error 500 here
}

网络API:
[HttpGet]
public IQueryable<Data> GetData()
{
try
{
return repository.Data();
}
catch (Exception ex)
{
// Nothing here
}
}

存储库:
public IQueryable<Data> GetData()
{
try
{
return dbContext.Data.Where(d=>d.Id == 1)
}
catch (Exception ex)
{
// nothing here
}
}

如何处理 SQL Server 异常(例如连接问题)? API 层和存储库层都没有捕获它们。
如果我将可查询转换为存储库中的数组:
var arr = dbContext.Data.Where(d => d.Id == 1).ToArray();

那当然会被捕获。但是可查询的场景怎么样,我怎么能捕获那些呢?

最佳答案

您无法处理任何异常的原因是 IQueryable 通常具有惰性实现。在您尝试枚举它们之前,没有实际发生。如果您只想捕获查询评估异常,您可以通过继承 QueryableAttribute 使用一个简单的技巧。 .代码如下,

public class QueryableWithExceptionAttribute : QueryableAttribute
{
public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
{
IQueryable result = base.ApplyQuery(queryable, queryOptions);
try
{
result.GetEnumerator(); // eager evaluate to catch exceptions
}
catch(Exception)
{
// do stuff
}

return result;
}
}

我认为这将在服务器上执行查询并获取一些结果。它仍然具有不获取整个结果集的优点/缺点,这意味着如果您有一个很大的结果集并且在初始获取后存在连接问题,您将无法捕获这些异常。不过,对于小结果集来说,它应该足够好了。如果您想要一个更强大的解决方案,您可以通过执行以下操作将整个结果集加载到内存中, result = LoadIntoMemory(result);而不是 result.GetEnumerator();
    public static IQueryable LoadIntoMemory(IQueryable q)
{
MethodInfo mi = typeof(QueryableWithExceptionAttribute).GetMethod("LoadIntoMemoryInternal", BindingFlags.NonPublic | BindingFlags.Static);
return mi.MakeGenericMethod(q.ElementType).Invoke(null, new[] { q }) as IQueryable;
}

private static IQueryable<T> LoadIntoMemoryInternal<T>(IQueryable<T> q)
{
return q.ToList().AsQueryable();
}

当然,这具有潜在使用更多内存的缺点。

关于exception-handling - 如何处理 IQueryable<> 方法中的后端异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11135279/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com