Pour certains de mes codes, j’utilise une méthode qui ressemble à ceci:
public static void Throw(ssortingng message) where TException : Exception { throw (TException) Activator.CreateInstance(typeof(TException), message); }
et je veux l’utiliser comme ceci (exemple simple):
public int MyMethod() { if(...) { return 42; } ThrowHelper.Throw("Test"); // I would have to put "return -1;" or anything like that here for the code to comstack. }
maintenant, évidemment, je sais qu’il est impossible que MyMethod
ne retourne jamais rien, car il MyMethod
toujours (indirectement) une exception. Mais bien sûr, je reçois la valeur du compilateur “tous les chemins ne renvoient pas de valeur”.
C’est pourquoi je demande s’il existe quelque chose comme l’atsortingbut C ++ [[noreturn]]
que je pourrais utiliser pour indiquer au compilateur que le code est réellement valide ?
EDIT: La raison pour laquelle je veux utiliser une classe d’assistance de projection au lieu de lancer directement ou d’utiliser un générateur d’exceptions est la suivante :
Les membres qui lancent des exceptions ne sont pas en ligne. Le fait de déplacer l’instruction à l’intérieur du générateur peut permettre au membre d’être en ligne.
En fait, j’ai mesuré le code et je bénéficierais (un peu) de l’inline, alors je serais heureux de trouver des moyens d’y parvenir.
La façon habituelle de procéder consiste à lever une exception sans créer de twig. Quelque chose comme ça:
public int MyMethod() { //Other code here. throw new InvalidOperationException(); }
J’ai en fait pensé à un moyen de faire ce que tu veux:
public class Thrower { public static TRet Throw(ssortingng message) where TException : Exception { throw (TException)Activator.CreateInstance(typeof(TException), message); } public int MyMethod() { if (new Random().Next() == 2) { return 42; } return Throw("Test"); // I would have to put "return -1;" or anything like that here for the code to comstack. } }
Non, il est impossible de faire comprendre au compilateur que la méthode lève toujours une exception et marque ainsi la fin de l’exécution du code.
Vous êtes obligé de
void
) Comme vous l’avez indiqué, dans une méthode avec un type de retour, vous serez obligé d’écrire le return X;
approprié return X;
instruction où X
est une valeur appropriée pour le type de retour de votre méthode.
Il n’y a pas moyen de contourner cela.