# [RFC] throw expression

- Thread: https://externals.io/message/109156
- Original archive: https://news-web.php.net/php.internals/109156
- Started by Ilija Tovilo on 2020-03-19T22:10:02+00:00
- Messages: 1
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · RFCs at https://externals.io/rfc.md · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #109156 — Ilija Tovilo — 2020-03-19T22:10:02+00:00

URL: https://externals.io/message/109156#109156

Hi everybody!

 

Yesterday I stumbled upon this Tweet by Nikita:

https://twitter.com/nikita_ppv/status/1240309838950866946

 

It answered why this seemingly correct block of code doesn't work:

 

    fn() => throw new Exception('nope');

 

The answer is rather simple. `throw` is a statement, not an expression. However, arrow functions only allow a single expression as their bodies. The obvious solution is to convert `throw` to an expression. This would also allow for the following:

 

    $value = $nullableValue ?? throw new InvalidArgumentException();

    $value = $falsableValue ?: throw new InvalidArgumentException();

 

At the moment this is generally done by moving the `throw` into a function:

 

    function throwInvalidArgumentException() {

        throw new InvalidArgumentException();

    }

 

    $value = $nullableValue ?? throwInvalidArgumentException();

 

or of course by just using an `if` statement:

 

    if ($nullableValue === null) {

        throw new InvalidArgumentException();

    }

 

Neither of those are bad. The new syntax is just slightly more concise.

 

An implementation of the change can be found here:

https://github.com/php/php-src/pull/5279

 

It's also noteworthy that the same feature has semi-recently been added to C# 7.0:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/throw#the-throw-expression

 

This has been proposed a handful of times in the internals mailing list but never extensively discussed:

https://externals.io/message/49569 (2010)

https://externals.io/message/15301 (2005)

https://externals.io/message/10553 (2004)

 

Let me know what you think!

 

Also, to actually create the RFC I need RFC karma. Can someone grant me those privileges? My username is ilijatovilo.

 

Thank you!
