Есть ли способ сделать исключения Java более информативными?
Например, возьмите этот код из документации ClassCastException:
Object x = new Integer(0);
System.out.println((String)x);
Java даст мне исключение ClassCastException с сообщением типаMsgstr "Невозможно привести что-то типа Integer к строке".Как я могу заставить его сказать: «Не могу вместо этого привести Integer 0 к строке»?И если бы я попытался наложить Строку "foo" на Лица, чтобы он сказал: "Не могу привести Строку foo к Лицу"?Итак, со значением объекта, который я пытался привести.
Могу ли я как-то заменить стандартное ClassCastException на более информативное, , поэтому мне не нужно вводить много блоков try / catch?Подклассы - это, конечно, вариант, но тогда мне придется ввести много блоков try / catch.
Причина, по которой я спрашиваю, на самом деле из-за другого языка программирования, который компилируется в JVM, Clojure.
В Clojure новички часто допускают эту ошибку:
(def my-list ("foo" "bar"))
Это приводит к сообщению об ошибке:
java.lang.String cannot be cast to clojure.lang.IFn
Это было бы очень полезно для начинающихчтобы увидеть что-то вроде:
java.lang.String "foo" cannot be cast to clojure.lang.IFn
, чтобы они могли понять, что они пытаются использовать здесь строку и функцию.
Было бы неплохо иметь возможность внедрить эти новые исключения в учебную среду, фактически не переписывая Clojure Compiler.Это может быть решено на уровне REPL путем перехвата этих исключений.Тем не менее мне любопытно, если это возможно с некоторыми изящными методами.