gpt4 book ai didi

c# - 为什么 async await 会抛出 NullReferenceException?

转载 作者:太空狗 更新时间:2023-10-29 21:33:08 24 4
gpt4 key购买 nike

我的代码看起来像这样

var userStartTask = LroMdmApiService.AddUser(user);
// .... do some stuff
await userStartTask;

AddUser() 抛出异常时,它会冒泡为 NullReferenceException。它不会等待 await。

但是如果我这样构造代码...

var result = await LroMdmApiService.AddUser(user);

然后异常会被正确捕获。谁能告诉我这是怎么回事?

这是显示问题的完整代码。这种情况的最佳做法是什么?

class Program
{
private static void Main(string[] args)
{
CallAsync();
Console.ReadKey();
}

public static async void CallAsync()
{
var task = CallExceptionAsync();
ThrowException("Outside");
await task;
}

public static Task CallExceptionAsync()
{
return Task.Run(() =>
{
ThrowException("Inside");
});

}

public static void ThrowException(string msg)
{
throw new Exception(msg);
}
}

最佳答案

这段代码

var result = await LroMdmApiService.AddUser(user);

实际上与这段代码相同:

var task = LroMdmApiService.AddUser(user);
var result = await task;

When AddUser() throws an exception, it bubbles up as a NullReferenceException. It doesn't wait for await.

AddUser 可能看起来像这样(其中 _servicenull):

public static Task AddUser(User user)
{
return _service.AddUser(user);
}

这将导致直接抛出一个NullReferenceException,而不是放在返回的任务上。

如果您总是希望将异常放在返回的任务上,那么让每个任务返回方法都async:

public static async Task AddUser(User user)
{
return await _service.AddUser(user);
}

但是,您应该考虑是否真的想要这样做。 NullReferenceException 特别是一个代码错误;这不是您在生产中应该捕捉或关心的异常(exception)。 To use Eric Lippert's term, it's a boneheaded exception .

在我看来,在什么地方抛出愚蠢的异常并不重要——无论它们是直接抛出还是放在任务上——因为这些异常只针对开发人员,而不是运行时。

关于c# - 为什么 async await 会抛出 NullReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336549/

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