2016-04-19 9 views
2

Pro die Antwort auf this question, die Form eine Ausnahme von einem asynchronen Verfahren geworfen für die Aufnahme sieht wie folgt aus:Debuggen Ausnahme durch mehrere verschachtelte async ruft

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

Großen. Dies scheint sich aufzulösen, wenn ich mehrere asynchrone Ebenen aufsprudeln möchte. Hier ist, wo die Ausnahme stammt:

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 ... 
} 

Hier ist die Methode, die MakePdfPagesFromPdf ruft:

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; 
    } 
} 

ich fangen die Ausnahme wie im Beispiel am Anfang dieser Frage zitiert. Debuggen bestätigt, dass dieser catch Block getroffen wird. Ich brauche aber die Ausnahme auf eine weitere Ebene zu sprudeln, um in einem Controller Route:

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

Es ist nicht diese höchste Ebene fangen an einem Haltepunkt nicht getroffen. Das Entfernen der Zwischenverriegelung hat keine Wirkung. Die Route fährt fort und kehrt zurück, aber ich kann keine Breakpoints treffen, nachdem ArgumentException vom Intermediate catch geworfen wurde. Was passiert hier und wie kann ich Breakpoints durch diesen ganzen asynchronen Stack treffen?

+2

Vielleicht können Sie minimal vollständige Beispiel nennen? Es sollte bis zur obersten Ebene aufsteigen. – Evk

+0

@Evk Danke, ich habe es bestimmt. Ich habe den Titel und den Inhalt der Frage so geändert, dass es um das Debugging ging. Ich dachte, dass es nicht funktionierte, weil ich keine Breakpoints auf der höchsten Ebene innerhalb des Fangs traf, aber ich bemerkte gleich nach dem Posten, dass ich tatsächlich die E-Mail bekommen hatte, die gesendet wurde. –

+1

Noch minimale vollständige Beispiel wird nicht schaden :) Weil es Breakpoint in Top-Level auch treffen sollte Fang. Vielleicht ist das offensichtlich, dass dein Quellcode nicht auf dem neuesten Stand ist? Ist der Haltepunkt rot oder weiß? – Evk

Antwort

1

Wenn die Methode, die Sie die Ausnahme propagieren wollen, ist async void (wie in Ihrem Beispiel von DoFoo), dann ist das Problem, dass es kein Task Objekt der Ausnahme mit (zu propagieren, da das Verfahren ist void und nicht Rückkehr ein Task)

eine andere Sache, die ich vorschlagen, nicht throw argumentException ist, sondern nur throw, wie der ehemalige Call-Stack der ursprünglichen Ausnahme verliert

Verwandte Themen