Wiem, jak wykonywać wyjątki ogólne w Grails za pomocą UrlMappings i ErrorController dla ogólnej obsługi wyjątków, więc jeśli wyjątek wymyka się kontrolerowi, użytkownik zostanie wysłany do ogólnej strony błędu, a wyjątek być zalogowanym. Wiem również, jak używać bloków try/catch, aby poradzić sobie z określonymi wyjątkami i spróbować odzyskać od nich.Obsługa wyjątków w kontrolerach Grails
Ale w większości kontrolerów, chcę tylko dać użytkownikowi nieco bardziej szczegółowy komunikat o błędzie, jeśli wystąpi wyjątek. Dlatego w akcji tworzenia chcę poinformować użytkownika, że element nie został utworzony. Lub w akcji importowania, chcę powiedzieć użytkownikowi, że import się nie powiódł. Obecnie kontrolery wyglądają następująco:
class ThingController {
def create = {
try {
// The real controller code, which quickly hands it off to a service
} catch (Exception e) {
handleException(e, "There was an error while attempting to create the Thing")
}
}
def delete = {
try {
// The real controller code, which quickly hands it off to a service
} catch (Exception e) {
handleException(e, "There was an error while attempting to delete the Thing")
}
}
private void handleException(Exception e, String message) {
flash.message = message
String eMessage = ExceptionUtils.getRootCauseMessage(e)
log.error message(code: "sic.log.error.ExceptionOccurred", args: ["${eMessage}", "${e}"])
redirect(action:index)
}
}
Należy zauważyć, że bloki catch nie robią nic innego w zależności od typu lub zawartości wyjątku; podają tylko nieco bardziej opisowy komunikat o błędzie oparty na kontrolerze. "Prawdziwy" kod kontrolera to zwykle 6-10 linii, więc posiadanie dodatkowych 4 linii kodu tylko po to, aby zmienić komunikat o błędzie wydaje się nadmierne. Ponadto narzeka zasada CodeNarc "CatchException", co wzmacnia moją opinię, że musi istnieć lepszy sposób na zrobienie tego. Zakładam, że inne aplikacje Grails mają podobne wymagania. Jaki jest sposób określania różnych komunikatów o błędach w zależności od akcji, z której wygasł wyjątek?
Jestem zainteresowany odpowiedziami, które wynikają z doświadczenia ze szczególnym sposobem rozwiązania tego problemu, a nawet lepiej, z linkami do baz kodów, w których mogę zobaczyć rozwiązanie w praktyce.
W przypadku głosowania w dół, proszę wyjaśnić, co należy zmienić w pytaniu lub dlaczego nie jest właściwe w przypadku przepełnienia stosu. Dzięki –