You could simply catch the exception.
(try (gen-and-load-class 'user.MyFailure :extends Exception)
(catch LinkageError e))
That will succeed (and return the class) the first time, and fail
silently after that. Not sure if that counts as "more elegant" or
not. :-)
gen-interface handles this for you, and takes the extra step of
warning you if the new definition is different from the old
definition. There's no reason gen-class couldn't do the same thing,
it just doesn't yet.
--Chouser