C# de los fundamentos al dominio — Lección 7
Gestión de la vida útil de los recursos con excepciones e IDisposable
Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.
El código que puede fallar debe diseñarse para incluir el estado posterior al fallo. Es importante no sólo detectar excepciones, sino también garantizar que recursos como archivos y conexiones estén organizados en cualquier ruta.
fracaso predecible
bool TrySpendGold(int amount)
{
if (amount < 0 || Gold < amount)
{
return false;
}
Gold -= amount;
return true;
}
Los resultados que ocurren con frecuencia, como la falta de oro, se pueden expresar como bool o como un tipo de resultado separado. Las excepciones se utilizan para fallas que son difíciles de manejar normalmente en el flujo actual, como corrupción de archivos o violación de contrato.
Manejo de excepciones
try
{
string json = File.ReadAllText(path);
settings = JsonSerializer.Deserialize<Settings>(json)
?? throw new InvalidDataException("Settings are empty");
}
catch (IOException error)
{
logger.Log(error.Message);
settings = Settings.CreateDefault();
}
Detecte únicamente las excepciones que se puedan manejar y recupérelas o páselas con información más significativa. Si detecta todas las excepciones sin manejar su contenido, los errores pueden ocultarse silenciosamente.
IDesechable y usando
using FileStream stream = File.OpenRead(path);
using var reader = new StreamReader(stream);
string text = reader.ReadToEnd();
Cuando sale del alcance de uso, se llama a Dispose. Además de las devoluciones normales, los identificadores de archivos se limpian de la ruta donde ocurrió una excepción.
GC recupera memoria para los objetos administrados, pero no promete cerrar inmediatamente archivos, sockets o buffers nativos. Los tipos que poseen estos recursos deben proporcionar un contrato IDisposable.
Reemplazar estados más tarde
Settings LoadSettings(string path)
{
string json = File.ReadAllText(path);
return JsonSerializer.Deserialize<Settings>(json)
?? throw new InvalidDataException("Invalid settings");
}
Settings loaded = LoadSettings(path);
currentSettings = loaded;
Si crea completamente una nueva configuración y la reemplaza con la configuración existente, el estado existente permanecerá incluso si hay un error durante la carga. El manejo de excepciones consiste en hacer que el estado y la vida útil de los recursos antes y después del fallo sean más predecibles que el número de capturas.