Ho un sacco di codice duplicato nel mio programma che fondamentalmente segue questa struttura:
If condition is true
Create ErrorRecord object
Call ThrowTerminatingError(error object)
End if
La struttura di questo codice è esattamente la stessa per ogni istanza, uno dei due parametri è diverso. Quindi per esempio questo fa parte di uno dei miei metodi
protected void ProcessRecord()
{
...
var login = PrivateFunctions.GetLogin(samAccountName);
if (login == null)
{
var errorRecord = new ErrorRecord(
new NullReferenceException($"A login for the user account '{samAccountName}' does not exist in the database."),
"LoginNotFound",
ErrorCategory.ObjectNotFound,
login);
ThrowTerminatingError(errorRecord);
}
var user = PrivateFunctions.GetUser(login);
if (user == null)
{
var errorRecord = new ErrorRecord(
new NullReferenceException($"A user for the login '{login.Name}' does not exist in the database."),
"UserNotFound",
ErrorCategory.ObjectNotFound,
user);
ThrowTerminatingError(errorRecord);
}
...
}
Penso che potrei creare un metodo statico con parametri per creare l'oggetto ErrorObject e inizializzarlo come richiesto. Ad esempio:
static internal ErrorObject CreateUserError(Login login)
{
return new ErrorRecord(
new NullReferenceException($"A user for the login '{login.Name}' does not exist in the database."),
"UserNotFound",
ErrorCategory.ObjectNotFound,
user);
}
E poi usato:
ThrowTerminatingErrorRecord(StaticClass.CreateUserError(login));
Esiste un modello di progettazione che potrei utilizzare oppure esiste un approccio migliore?
Modifica: In risposta al primo commento, questo è ciò che accade se lancio un'eccezione anziché costruire il record di errore:
Calling ThrowTerminatingError:
Get-DatabaseUserInformation : "A login for the user account 'domain\username' does not exist in the database."
+ Get-DatabaseUserInformation <<<<
+ CategoryInfo : ObjectNotFound: (:) [Get-DatabaseUserInformation], Exception
+ FullyQualifiedErrorId : "LoginNotFound",Module.Cmdlet
Lancio di un'eccezione:
Get-DatabaseUserInformation : An exception was thrown.
+ get-databaseuser <<<<
+ CategoryInfo : NotSpecified: (:) [Get-DatabaseUserInformation], Exception
+ FullyQualifiedErrorId : System.Exception,Module.Cmdlet