【发布时间】:2017-12-19 21:48:34
【问题描述】:
我正在查询数据库并将结果包装到视图模型中。测试故意错误的连接字符串,当查询在for (object result in query) 处执行时抛出异常。根据我的研究(如下),应由外部 try/catch 块处理异常,而不添加 async 作为 lambda 的关键字。但是,当我运行没有async 关键字的代码时,没有捕获到异常并且程序崩溃了。
为什么我的异常没有得到处理?
请注意,这里唯一的变化是将 async 添加到 Task.Run 的 lambda 表达式中。
According to Stephen Cleary's comment on this answer 外部try/catch 应该在没有async 的情况下捕获异常。
I have confirmed that "Break When Thrown" is disabled
更新
从评论中,我尝试了Disabling "Just my Code"
它确实允许捕获异常,但它仍然产生异常行为。
如果您在禁用“仅我的代码”的情况下运行 非-async 示例,则会在返回到 catch 块之前抛出异常 15 次。
异常未被外部try/catch捕获
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Data.Linq;
using System.Data.Linq.Mapping;
namespace ThisQuestion
{
class Program
{
static void Main(string[] args)
{
DoWork();
Console.ReadLine();
}
private async static void DoWork()
{
DataContext _db = new DataContext("badconnectionstring");
Table<Objects> objects = _db.GetTable<Objects>();
IQueryable<object> query =
from o in objects
select o;
try
{
await Task.Run
(() =>
{
foreach (object result in query) ;
});
}
catch (System.Data.SqlClient.SqlException)
{
System.Diagnostics.Debug.WriteLine("SQLError");
}
}
}
[Table(Name="Objects")]
class Objects
{
private string AColumn;
}
}
外部try/catch捕获的异常
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Data.Linq;
using System.Data.Linq.Mapping;
namespace ThisQuestion
{
class Program
{
static void Main(string[] args)
{
DoWork();
Console.ReadLine();
}
private async static void DoWork()
{
DataContext _db = new DataContext("badconnectionstring");
Table<Objects> objects = _db.GetTable<Objects>();
IQueryable<object> query =
from o in objects
select o;
try
{
await Task.Run
(async () =>
{
foreach (object result in query) ;
});
}
catch (System.Data.SqlClient.SqlException)
{
System.Diagnostics.Debug.WriteLine("SQLError");
}
}
}
[Table(Name="Objects")]
class Objects
{
private string AColumn;
}
}
【问题讨论】:
-
我在这里没有看到明确的问题描述,也绝对没有看到有人提出问题。如果您的意图是转到链接的帖子以查看所提出的问题,那么这是这些帖子的副本,不属于此处。
-
没有人能告诉你为什么一个不可运行的不完整代码 sn-p 会以某种你没有描述的方式表现。如果您提供一个完整代码 sn-p,它能够实际复制所描述的行为,实际描述它的行为方式以及您期望它的行为方式,那么您可以开始接近一个可回答的问题题。可悲的是,大多数 SO 用户(至少据我所知)没有读心设备,因此不知道你想要你的代码做什么,它在做什么,或者它是什么,当你没有'没有告诉我们这些事情。
-
我不确定我还能告诉你什么。这是一个 SQL 查询,它抛出了一个异常,我没有根据我看到的所有实施建议进行处理。
-
运行两个 sn-ps 时,我看到两种情况下都处理了错误。他们的行为并没有不同。
-
那么你原来的声明,即其中一个代码 sn-ps 没有处理错误是错误的,因为它只是因为你如何配置调试器而中断了调试器。如果您不希望调试器中断,您显然知道如何禁用它。
标签: c# exception asynchronous exception-handling async-await