Ho ereditato il codice nel nostro progetto che assomiglia a questo. È un metodo in una classe.lanciare un'eccezione nel blocco try anziché bloccare il blocco?
protected override bool Load()
{
DataAccess.SomeEntity record;
try
{
record = _repository.Get(t => t.ID.Equals(ID));
if (record == null)
{
throw new InvalidOperationException("failed to initialize the object.");
}
else
{
this.ID = record.ID;
// this.OtherProperty = record.SomeProperty;
// etc
}
}
catch (Exception)
{
throw;
}
return true;
}
Se dunque io chiamo questo metodo Load dal mio livello di interfaccia utente, probabilmente sarei voglio avere un blocco try catch per catturare qualsiasi eccezione causata dalla mancata caricare l'istanza, per esempio InvalidOperationException, ma il codice sopra riportato mi sembra sbagliato.
L'eccezione InvalidOperationException non può essere ingerita dalla dichiarazione catch? tale dichiarazione di cattura colga anche potenziali problemi con _repository.Get, oltre a potenziali problemi con l'impostazione delle proprietà se il record è valido.
Ho pensato che dovrei forse ristrutturarlo aggiungendo ulteriori istruzioni catch try per gestire le operazioni Get e le operazioni di configurazione delle proprietà separatamente, o aggiungere più blocchi catch gestendo diverse eccezioni, ma ho chiesto a un collega e lui ha suggerito che il try catch è irrilevante in questo caso, e deve essere rimosso completamente, lasciando le cose come:
protected override bool Load()
{
DataAccess.SomeEntity record;
record = _repository.Get(t => t.ID.Equals(ID));
if (record == null)
{
throw new InvalidOperationException("failed to initialize the object.");
}
else
{
this.ID = record.ID;
// this.OtherProperty = record.SomeProperty;
// etc
}
return true;
}
vorrei un po 'un secondo parere, ho appena iniziato a prendere un interesse per la gestione delle eccezioni, quindi mi piacerebbe assicurati che lo sto facendo nel modo giusto secondo le migliori pratiche.
Il tuo collega aveva ragione. Entrambe le versioni fanno lo stesso, quindi perché non avere meno codice? –
Vorrei suggerire che * throw * è stato lasciato lì dal debugging - con quel pezzo di codice puoi piazzare un breakpoint sul * throw *, e poi ispezionare l'eccezione (usando '$ exception' nella finestra immediata). Fare ciò è utile quando non si è ancora sicuri esattamente di cosa potrebbe uscire da lì, e come gli altri poster hanno detto che non ha alcun effetto altrimenti. – slugster