Как я должен отказаться от своего исключения в Clojure? [Дубликат]

Типы ссылок по умолчанию равны null, чтобы указать, что они не ссылаются на какой-либо объект. Следовательно, если вы попытаетесь получить доступ к объекту, на который ссылаетесь, а его нет, вы получите исключение NullReferenceException.

Для Ex:

SqlConnection connection = null;
connection.Open();

Когда вы запускаете это кода, вы получите:

System.NullReferenceException: Object reference not set to an instance of an object.

Вы можете избежать этой ошибки, например, следующим образом:

if (connection != null){
    connection.Open();
}

Примечание. Чтобы избежать этой ошибки, вы всегда должны инициализировать свои объекты прежде чем пытаться что-либо сделать с ними.

44
задан erikcw 30 September 2010 в 23:40
поделиться

3 ответа

Сделайте файл src/user/MyException.clj (где src включен CLASSPATH), содержащий:

(ns user.MyException
  (:gen-class :extends java.lang.Exception))

Проверьте значение *compile-path* в REPL. Убедитесь, что этот каталог существует и находится на CLASSPATH. Создайте каталог, если он не существует; Clojure не сделает этого для вас.

user> *compile-path*
"/home/user/foo/target/classes/"
user> (System/getProperty "java.class.path")
".......:/home/user/foo/target/classes/:......."

Скомпилируйте свой класс:

user> (compile 'user.MyException)
user.MyException

Если это сработало, в *compile-path* теперь у вас должны быть файлы примерно так:

/home/user/foo/target/
/home/user/foo/target/classes
/home/user/foo/target/classes/user
/home/user/foo/target/classes/user/MyException.class
/home/user/foo/target/classes/user/MyException__init.class
/home/user/foo/target/classes/user/MyException$loading__4410__auto__.class

Перезагрузите Clojure REPL / JVM, чтобы загрузить эти классы. Опять же, убедитесь, что эти новые файлы классов находятся на CLASSPATH. Теперь вы сможете использовать свой класс:

user> (user.MyException.)
#<MyException user.MyException>
27
ответ дан Brian Carper 3 September 2018 в 17:01
поделиться

FWIW, если вы не создаете настраиваемое исключение из соображений взаимодействия, вы можете захотеть вместо этого использовать clojure.contrib.condition. Он поставляется с предварительно скомпилированным пользовательским исключением, что вы копируете пользовательские данные на использование его API. Я смог избежать создания множества пользовательских исключений, используя вместо этого. Документы находятся здесь: http://clojure.github.com/clojure-contrib/condition-api.html

9
ответ дан Ben Mabey 3 September 2018 в 17:01
поделиться

Вместо генерации пользовательских классов существует два гораздо более простых способа использования пользовательских исключений:

  1. Используйте slingshot - это предоставляет пользовательские throw+ и catch+ макросы, которые позволяют вам бросать и захватывать любой объект, а также исключения.
  2. В clojure 1.4 и выше вы можете использовать clojure.core / ex-info и clojure .core / ex-data , чтобы генерировать и улавливать класс clojure.lang.ExceptionInfo, который обертывает сообщение и карту данных.

Использование этого просто:

(throw (ex-info "My hovercraft is full of eels"
                {:type :python-exception, :cause :eels}))

(try (...)
  (catch clojure.lang.ExceptionInfo e
    (if (= :eels (-> e ex-data :cause))
      (println "beware the shrieking eels!")
      (println "???"))))

Или в среднем тесте:

(fact "should throw some eels"
    (...) 
    => (throws clojure.lang.ExceptionInfo
          #(= :eels (-> % ex-data :cause))))
66
ответ дан Micah Elliott 3 September 2018 в 17:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: