Skip to content

How to Resolve Error "CS0156: A throw statement with no arguments is not allowed outside of a catch clause" in C#

Learn how to fix the C# compiler error CS0156 when using 'throw;' outside a catch block, including correct exception handling syntax and stack trace preservation.

The Compiler Error CS0156 is a context error related to Exception Handling. The message reads: "A throw statement with no arguments is not allowed outside of a catch clause".

In C#, the throw keyword has two forms:

  1. throw new Exception(...);: Throws a specific exception object. This is valid anywhere.
  2. throw; (No arguments): Re-throws the currently active exception. This preserves the original stack trace.

This error occurs when you use the second form (throw;) in a location where there is no "current exception" to pass along, such as inside a try block, a finally block, or standard method logic.

Understanding Re-throwing

The syntax throw; is a specific command that tells the runtime: "Take the exception I am currently catching and let it bubble up to the next level, keeping all its history intact."

If you are not inside a catch block, the compiler doesn't know what exception you are referring to.

Scenario 1: Using throw; in Standard Logic

A common mistake is assuming throw; is a shorthand for "throw a generic error" or "stop the program".

Example of error: trying to stop execution inside an if statement using throw;.

public void ValidateUser(string name)
{
    if (string.IsNullOrEmpty(name))
    {
        // ⛔️ Error CS0156: A throw statement with no arguments is not allowed outside of a catch clause.
        // The compiler asks: "Throw WHAT? There is no active exception here."
        throw; 
    }
}

Scenario 2: Using throw; in a finally Block

The finally block executes after the try and catch blocks have finished. Even if an exception occurred, by the time code reaches finally, the "handling" phase where throw; is valid has technically passed or is not the primary context of the block.

Example of error:

public void Process()
{
    try
    {
        // Work
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error caught");
    }
    finally
    {
        // ⛔️ Error CS0156: You cannot use empty 'throw;' inside finally.
        // If you want to throw an error here, it must be a NEW exception.
        throw;
    }
}

Solution: Throw a New Exception

If you are outside a catch block (e.g., validating input), you must instantiate a specific exception object to throw.

Solution: provide an exception object after the throw keyword.

using System;

public void ValidateUser(string name)
{
    if (string.IsNullOrEmpty(name))
    {
        // ✅ Correct: We explicitly create a new exception object.
        throw new ArgumentNullException(nameof(name), "Name cannot be empty");
    }
}

Correct Usage of throw;

For reference, here is the only valid place to use throw;: inside a catch block.

try
{
    // Risky code
}
catch (Exception ex)
{
    // Log the error
    Logger.Log(ex);

    // ✅ Correct: Re-throw the SAME exception to the caller.
    // This preserves the stack trace (where the error actually happened).
    throw;
}

Conclusion

CS0156 is a context error.

  1. Check the Block: Are you inside catch (...) { }?
  2. If Yes: throw; is valid.
  3. If No: You must provide an argument, like throw new Exception("Message");.
Navigation