gpt4 book ai didi

c# - 通过多个嵌套异步调用调试异常

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:35 25 4
gpt4 key购买 nike

根据对 this question 的回答,捕获异步方法抛出的异常的形式如下:

public async void DoFoo()
{
try
{
await Foo();
}
catch (ProtocolException ex)
{
/* The exception will be caught because you've awaited the call. */
}
}

太棒了。如果我想冒泡几个异步级别,这似乎会瓦解。这是异常的来源:

internal static async Task MakePdfPagesFromPdf(Pdf pdf, byte[] pdfBytes, int jobId)
{
IEnumerable<Image> pdfAsImages = PdfOperations.PdfToImagesPdfium(pdfBytes, dpi);

if(pdfAsImages.Count() < 1)
{
throw new ArgumentException("PDF has no pages.");
}

// ... more code ...
}

这是调用 MakePdfPagesFromPdf 的方法:

internal static async Task ProcessBase64Pdf(Pdf pdf, int jobId, string componentDesignName)
{
byte[] pdfBytes = ConvertBase64ToPdfByteArray(pdf.Url); // Base64 data is in pdf.Url
await UploadPdfToAwsS3(pdf, pdfBytes, jobId, componentDesignName);
try
{
await MakePdfPagesFromPdf(pdf, pdfBytes, jobId);
}
catch(ArgumentException argumentException)
{
throw argumentException;
}
}

我发现了这个问题开头引用的例子中的异常。调试断言此 catch block 已命中。但是,我需要将异常冒泡到一个 Controller 路由内部:

try
{
await PdfsController.ProcessBase64Pdf(pdf, componentDesign.JobId, componentDesign.Name);
}
catch (ArgumentException argumentException)
{
// Now do stuff with the exception
}

它没有在断点处达到这个最高级别的捕获。移除中间卡扣没有任何效果。路由继续并返回,但在从中间 catch 抛出 ArgumentException 后,我无法命中断点。这是怎么回事,我如何通过整个异步堆栈来设置断点?

最佳答案

如果您要传播异常的方法是 async void(例如在您的 DoFoo 示例中),那么问题是没有 Task 对象传播异常(因为该方法是 void 并且不返回 Task)

我建议的另一件事是不要throw argumentException,而只是throw,因为前者丢失了原始异常的调用堆栈

关于c# - 通过多个嵌套异步调用调试异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36728740/

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