Skip to main content

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

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

Don't use throw ex; When fixing this, beginners often type throw ex; inside a catch block. While valid C#, this resets the stack trace to the catch block, losing the information about where the error originally occurred.

  • Best: throw; (Preserves stack trace).
  • Acceptable: throw new Exception("Msg", ex); (Wraps error).
  • Bad: throw ex; (Destroys stack trace).

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");.