Desde os primórdios do C# a utilização da palavra-chave throw esteve restrita a instruções voltadas à geração de exceções. A utilização deste recurso em uma expressão (instrução que retorna algum valor) não era possível de forma direta, o que forçava o uso de estruturas condicionais como ifs.
Tal situação pode ser observada na implementação da classe Temperatura:
using System;
namespace ThrowExpressions
{
public class Temperatura
{
private double _celsius;
public double Celsius
{
get
{
return _celsius;
}
set
{
if (value >= -273.15)
_celsius = value;
else
throw new Exception("Temperatura inválida!");
}
}
public double Fahrenheit
{
get => ((9.0 / 5.0) * _celsius) + 32;
}
}
}
O C# 7.0 conta agora com as Throw Expressions, um tipo de funcionalidade que permite lançar exceções a partir do próprio código que define uma expressão. O próximo exemplo é uma versão refatorada da classe Temperatura, com a propriedade Celsius empregando este novo recurso:
using System;
namespace ThrowExpressions
{
public class Temperatura
{
private double _celsius;
public double Celsius
{
get
{
return _celsius;
}
set
{
_celsius = value >= -273.15 ? value : throw new Exception("Temperatura inválida!");
}
}
public double Fahrenheit
{
get => ((9.0 / 5.0) * _celsius) + 32;
}
}
}
Este recurso pode ainda ser combinado aos novos Expression-bodied Members da linguagem, produzindo assim um resultado mais enxuto:
using System;
namespace ThrowExpressions
{
public class Temperatura
{
private double _celsius;
public double Celsius
{
get => _celsius;
set => _celsius = value >= -273.15 ? value : throw new Exception("Temperatura inválida!");
}
public double Fahrenheit
{
get => ((9.0 / 5.0) * _celsius) + 32;
}
}
}
Ao tentar associar um valor inválido à propriedade Celsius:
using System;
namespace ThrowExpressions
{
class Program
{
static void Main(string[] args)
{
Temperatura t = new Temperatura();
t.Celsius = -300;
Console.ReadKey();
}
}
}
Acontecerá então o seguinte erro em tempo de execução:





