metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-10-10 10:39 am
Entry tags:

О проверке входных параметров, принятой в Java

Есть такой оккультный стек-трейс: https://gist.github.com/def1fa8666a8ac83130a.
Причина в том, что в деконструктор массивов кложури вида (let [sql & params] some-array] передан пустой массив и строка sql в таком случае становится null и оный null передается в jdbc драйвер.
Строка на которой валится NPE, выглядит следующим образом:
protected boolean checkForEscapes(String sql) {
sql = sql.toLowerCase();

А вопрос, вообще говоря, в следующем: почему никто не проверяет параметр на валидность хотя бы в одной точке входа в одной из трех либ (clojure.java.jdbc, apache dbcp или jaybird)?

Выглядит так, как будто нормальную проверку параметров на валидность на границах API в жабе делать не принято.

PS: [livejournal.com profile] artureg упорно убеждает меня, что "пусть валится", потому что проверка должна быть "в другом слое". Судя по всему, все разработчики думают, что обработка ошибок должна быть в другом слое :)

[identity profile] artureg.livejournal.com 2012-10-10 07:49 am (UTC)(link)
судя по именам это дао леер, обычно валидация и обработка ошибок происходит выше.
develop7: (dero)

[personal profile] develop7 2012-10-10 07:50 am (UTC)(link)
кстати ребе М настолько суров, что гитхаб падает при попытке показать его профайл

[identity profile] artureg.livejournal.com 2012-10-10 07:50 am (UTC)(link)
ксти, а зачем переводить запрос? в нижний регистр?

[identity profile] jdevelop.livejournal.com 2012-10-10 08:05 am (UTC)(link)
вы знаете, раньше для меня стандартом ебанутости стектрейса был стектрейс спрингового приложения или какого-нибудь уёбложика

теперь это определенно кложура.

[identity profile] volodymir-k.livejournal.com 2012-10-10 08:15 am (UTC)(link)
Вопрос о месте проверки и способе проявления ошибки непрост и может иметь разные варианты ответа.
По идее, вполне возможно задокументировать NPE как валидную ошибку в методе (@throws NullPointerException if ... are null) и это ВАША проблема, почему вы не прочитали жавадок.

Все эти тривиальные проверки тратят циклы и от них желательно избевляться на верхних уровнях. Для этого в яве экспериментально например сделали @NotNull / @Nullable аннотации и лёгкий inference. Естественно кложа не даёт такого. Что сказать, ну такой язык. Я посмотрел -- неадекват.

[identity profile] zmila.livejournal.com 2012-10-10 08:24 am (UTC)(link)
в самом деле, а ты почему не проверил на nil? :)

и да, в жабе это не принято. обычно клиент проверяет, что он отдаёт либе. а та просто использует, и если что не так, кидается эксцепшенами.

[identity profile] max630.livejournal.com 2012-10-10 08:46 am (UTC)(link)
А не похуй ли, в конце концов? Если код уже уехал от места где вместо null должен был быть не null, всё равно ошибку трудно искать.

И да, почему таки там null вместо пустой строки?

[identity profile] andrew kondratovich (from livejournal.com) 2012-10-10 09:09 am (UTC)(link)
Имхо из апи могут сыпаться всякие SuperLibrarySomeException. Но вот не NPE...

[identity profile] raydac.livejournal.com 2012-10-10 10:03 am (UTC)(link)
вот в одной крупной компании Java программист тоже подумал что кто то на другом уровне проверит, как результат 5000 девайсов на перепрошивку (проданных девайсов причем)
Edited 2012-10-10 10:04 (UTC)

[identity profile] chumpa.livejournal.com 2012-10-10 10:46 am (UTC)(link)
ассерты же! помнится, был приятно удивлён когда включил ассерты и в некоторых хороших библиотеках оно начало срабатывать на нехороших вызовах из моего кода.

[identity profile] juan-gandhi.livejournal.com 2012-10-10 08:17 pm (UTC)(link)
Довольно любопытно, используя бестиповой язык, призывать к массовым проверкам.

[identity profile] bydl0coder.livejournal.com 2012-10-10 11:50 pm (UTC)(link)
Странный этот ваш артурег. "Пусть валится" это из руби, там принято на любые неправильные параметры реагировать NPE с километровым стектрейсом. В сишарпе я аргументы проверял почти в каждом публичном методе. Кстати, дико вот это вольное обращение с параметрами в руби и джс не нравится, в сишарпе чуть что не так - иди на хуй с ArgumentException, а в динамических либо попытаются таки понять, что ты имел в виду, либо свалятся в дебрях. И то и другое мешает отладке.
Edited 2012-10-11 00:07 (UTC)