Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8986475
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 15, 20262026-06-15T21:33:33+00:00 2026-06-15T21:33:33+00:00

I know that await can’t be used in catch clause. However I haven’t really

  • 0

I know that await can’t be used in catch clause.
However I haven’t really faced a problem related to this, until now …

Basically I have a layer that is responsible for receiving incoming requests, processing them, building messages from them and pass the messages to another layer responsible to send the messages.

If something goes wrong during the sending of the message, a custom exception is thrown, and caught by the message sending layer. At this point, a failure record for this message should be inserted in DB (takes some time, so async), and the exception should be propagated to the upper layer which is in charge of sending an error response to the client that made the request.

Here is some very simplified code for illustration purpose below :

public async Task ProcessRequestAsync(Request req)
{
    int statusCode = 0;

    try
    {       
       await SendMessageAsync(new Message(req));        
    }
    catch(MyCustomException ex)
    {
       statusCode = ex.ErrorCode;
    }

    await SendReponseToClientAsync(req, statusCode);
}


public async Task SendMessageAsync(Message msg)
{
    try
    {           
       // Some async operations done here
    }
    catch (MyCustomException ex)
    {       
        await InsertFailureForMessageInDbAsync(msg, ex.ErrorCode); // CAN'T DO THAT
        throw;
    }
}

Of course the request processing layer knows nothing about the DB, it is just in charge of building a message, passing the message to the message processing layer, and send a response to the client (positive or negative).

So I think it makes sense … If an exception happens, my “business” layer want to insert a failure record in DB and rethrow the exception so that the “request” processing layer can do what’s necessary (in this context, send a negative response back to the client).

Should exceptions not be used this way ? It seems clean to me but the fact that I can’t do this await in the catch clause makes me think there is maybe a code smell with the design (even if I the idea of handling the exception in one layer then rethrowing it for the upper layer to do some different handling as well sounds to me like it’s exactly what exceptions are made for).

Any idea arround this ?

Thanks !

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-15T21:33:34+00:00Added an answer on June 15, 2026 at 9:33 pm

    I’ve run into this a couple of times as well.

    As Rafael commented, you could just ignore the result of InsertFailureForMessageInDbAsync:

    public async Task SendMessageAsync(Message msg)
    {
      try
      {           
        // Some async operations done here
      }
      catch (MyCustomException ex)
      {       
        var _ = InsertFailureForMessageInDbAsync(msg, ex.ErrorCode);
        throw;
      }
    }
    

    Note that any exceptions from InsertFailureForMessageInDbAsync will be ignored by default.

    Your other option is more complex:

    public async Task DoSendMessageAsync(Message msg)
    {
      // Some async operations done here
    }
    
    public async Task SendMessageAsync(Message msg)
    {
      var task = DoSendMessageAsync(msg);
      MyCustomException exception = null;
      try
      {
        await task;
        return;
      }
      catch (MyCustomException ex)
      {
        exception = ex;
      }
    
      await Task.WhenAll(task, InsertFailureForMessageInDbAsync(msg, exception.ErrorCode));
    }
    

    This will asynchronously handle the exception and return a Task that has a real AggregateExption (containing both exceptions if InsertFailureForMessageInDbAsync does throw one).

    Unfortunately, await will ignore the second exception. If you really want all exceptions passed up, you can replace the last line (await Task.WhenAll...) with something like this:

    Exception exception2 = null;
    try
    {
      await InsertFailureForMessageInDbAsync(msg, exception.ErrorCode);
    }
    catch (Exception ex)
    {
      exception2 = ex;
    }
    
    if (exception2 == null)
      throw new AggregateException(exception);
    else
      throw new AggregateException(exception, exception2);
    

    But that’s pretty complex, and not exactly the kind of pattern you want repeated. If possible, I’d just ignore the logging result as Rafael recommended.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I know that this sort of question has been asked here before, but still
I know that this line of code will make the cell text-wrap: $objPHPExcel->getActiveSheet()->getStyle('D1')->getAlignment()->setWrapText(true); 'D1'
I know that I can hijack a form by showing a login form in
First of all, I know that it can be implemented with a mutex and
This is a difficult problem to describe so please let me know if anything
I know that Phonegap has an event for back button, but it's only available
I know that if port 443 is open that means the remote host supports
I know that when I use range([start], stop[, step]) or slice([start], stop[, step]) ,
I know that Java have its own garbage collection, but sometimes I want to
I know that immutable objects always have the same state, the state in which

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.