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: