Alexander
если он совпадает хэндлер вызывается, если нет, то исключение идёт выше
Alexander
до top-level handler
Cheese
если не знаешь конкретный тип, лови SomeException
Alexander
можно ловить все что угодно, если ловишь SomeException
Alexander
но есть но
Alexander
всякие асинхронные исключения, после которых треду бы хорошо умирать оно тоже словит
Alexander
например ^C от юзера в первом треде
Alexander
есть SomeAsyncException, но это пока скорее не работает, чем работает если ты не управляешь кодобазой шлющей такие исключениия
Alexander
ну и можно проверять, что тебе пришло Async исключения - проверки через Data.Typeable typeOf/cast
Anonymous
если не знаешь конкретный тип, лови SomeException
Ну вот о чем и речь. А SomeException не есть хорошо, ибо можно перехватить то, что не стоило бы
Alexander
не перехватывай что не стоит
Alexander
в чем проблема?
Alexander
ты ж этим управляешь
Anonymous
Если ты что-то делаешь и просто генеришь дальнейшее исключение, то ладно еще...
Alexander
разница с MonadError, что можно кинуть то, что не стоит
Cheese
если почитать ещё несколько строчек документации, то можно увидеть, как фильтровать перехват по условию
Cheese
catchJust и tryJust
Alexander
ну тут по типу досточно же
Alexander
а вообще @cblp_su прав
Alexander
слушай его
Cheese
спасибо
Anonymous
Гмм.... Прочел, спасибо :-)
Anonymous
Сейчас попробую
Alexander
вообще тут интересный вопрос может ты хочешь трекать возможные исключения в типе
Alexander
но обычно это если у тебя нет IO/STM/ST в базе стека
Anonymous
Почему же? Не понял.
Alexander
если у тебя есть IO/STM/ST в базе, то код может кидать любые исключения
Alexander
и гарантия e не очень много чего значит
Alexander
+ т.к. у тебя fundep то тебе нужно или делать разные монадки и переходить между слоями (но нафига тебе тогда mtl) или делать супертип
Alexander
если делать много супертипов, то в конце может оказаться что ты переизобрел расширяемые исключения, но менее эффективно
Anonymous
Гмм... Расширяемые исключения?
Anonymous
Почитаю о них, спасибо.
Anonymous
А, кстати, где? Control.Exception. Extensible говорит, что теперь он просто ре-экспортирует Control Exception
Зигохистоморфный
о, интересный пост http://www.parsonsmatt.org/2017/11/21/monadbasecontrol_in_five_minutes.html
Alexander
т.к. Control.Exception это как раз расширяемые
Anonymous
Ок, сорри, если тупой вопрос, но что это? (
Alexander
статью кинуть или пересказать что выше написано?
Alexander
грубо говоря расширяемый супертип для исключений
Alexander
в любом месте кода ты можешь создать новый тип и им кидаться
Alexander
а те кто о нём знают могут его ловить если хотят
Anonymous
Статью). Вообще еще много чего не понимаю в этом чате (
Anonymous
А, понятно
Alexander
реализовано через тип данных SomeException = forall e . Exception e => SomeException e и класс Exception
Alexander
когда кидаешь исключение то оно заворачивается в SomeException
Alexander
+ это все на уровне rts поддерживается
Alexander
https://simonmar.github.io/bib/papers/ext-exceptions.pdf
Alexander
вот статья
Anonymous
Ну вот у меня квест - http-client мне кидает 1 исключение, которое я хочу перехватывать, не трогая остальные. Для этого нужно знать его конкретный тип.
Alexander
а ты его не знашь?
Anonymous
Пока делаю catch someexception, читаю текст ошибки, если он подходит - делаю одно, если нет, то кидаю свое исключение
Cheese
всё правильно. это называется "отладка" и "разработка"
Anonymous
Ну, я могу его узнать, почитав доку, но понимаю, что это не всегда просто и хотелось бы как-нибудь(например в ghci) узнать его тип у себя.
Cheese
λ> undefined `catch` (\(SomeException e) -> print $ typeOf e) ErrorCall
Cheese
кажется, я уже писал выше про typeOf
Anonymous
кажется, я уже писал выше про typeOf
Да, сейчас попробую, спасибо.
Anonymous
Alexander
но лучше доку читать
Alexander
ну написание программы путём "исследования кода в ghci" это странная идея
Alexander
так же как и проверка исключения по тексту
Alexander
так.. а как по toEncoding toJSON зоделать?
Cheese
он глазами читает, если я правильно понимаю
Cheese
так.. а как по toEncoding toJSON зоделать?
напрямую никак. Encoding же сразу байты генерит. только если строку обратно parseJSON
Alexander
жуть какая и что руками 2 вызова писать?
Alexander
2 метода определять
Anonymous
он глазами читает, если я правильно понимаю
В смысле? Нет, просто в программе проверяю наличие в тексте сообщения наличие нужного куска)
Cheese
дженериками или темплэйтами выводи
Cheese
наверное, ты не знал, что SomeException можно распаковать
Cheese
и дальше извлечь какую-то информацию, например, с помощью Typeable
Alexander
дженериками или темплэйтами выводи
он чушь выводит, это на другой стороне js-ом читать
Anonymous
а, вот это ужас, конечно
Не спорю, поэтому и хочу изменить)
Alexander
читаешь документацию, ловишь через catches нужные исключения
Anonymous
Про typable только недавно прочел)
Alexander
в топлевеле (ну или разумном месте) делаешь ловлю SomeException, логируешь и шлёшь дальше
Alexander
последнее нужно против нехороших авторов, которые не документируют список исплючений
Anonymous
Ну вот я про них и говорил