Discussion:
Abort внутри библиотеки, привет Go пейсателям panic
(слишком старое сообщение для ответа)
Nil A
2021-10-29 03:32:22 UTC
Permalink
Hello, All!

Тут вот вспомнил, что меня очень раздражает, когда в коде библиотеки я вижу
abort() когда аффтар не знает что дальше делать. Ну ладно ещё там память
кончилась, и действительно, дальше ехать уже не получиться, хотя в линуксах,
например, аллокация памяти реально только виртуальные странички выделает, и на
64битной платформе оно кончится практически не может, т.е. когда память реально
кончится, то ядро либо пристрелит OOM-Killer'ом, или какой-нибудь SIGBUS
словит, потому что физические странички кончатся.

Про abort() в библиотеках. Есть такие аффторы, у них там файл не открылся/не
зависался, а они сразу в abort(), или какая-то проблема с сокетом если. Блин,
выдай на верх ошибку, разберётся программа что делать с кривым файлом или
сокетом, перепопробует по-другому, или как-то юзеру аккуратно сообщит, но не
выпадать же прям тут на месте.

Так вот, пейшу я ту на Go. А в Go, как вы знаете, нету исключений. Так бы
аффтар библиотечки кинул нам внутри исключение, а ты потом лови его в своём
коде, или не лови и получай abort() ;-) Но аффтарам библиотек на Go бывает
сильно ломово сильно изнутри протаскивать ошибку, чтобы её потом наружу
передать, проще же panic(err) сделать и иди читай стек.
Ну так-то я на гоу пейшу там утилитки, и бывает удобно готовую библиотеку с
гитхаба импортировать, опять же, привет плюсям, где чужую библиотеку к себе
притащить это не всегда просто. И вот аффтар библиотечки сшоткатил и panic
кинул. Ладно у меня утилитка, и я бы и сам бы ничего умнее не придумал, чем
выйти, но а если я сервер мать его пишу высоконагруженный, как во всех этих гоу
рекламмах, какой он классный...

Best Regards, Nil
Valentin Nechayev
2021-11-11 20:23:32 UTC
Permalink
Hi,
NA> Так вот, пейшу я ту на Go. А в Go, как вы знаете, нету исключений.

Есть, возбуждаются через panic, ловятся через recover.
Hу а что они не называются при этом исключениями и ловятся слегка через оппу -
вопрос к двуличным разработчикам.

Вот я тестик накидал просто из чтения доки:

==={{{
package main

import "fmt"

type xdata struct {
Value int
}

func zoo() {
panic(444)
}

func moo(xd *xdata) int {
defer func() {
if exc := recover(); exc != nil {
fmt.Println("Caught something")
(*xd).Value = -1
}
}()
zoo()
(*xd).Value = 1
return 1
}

func main() {
var xd xdata
fmt.Println(moo(&xd), xd.Value)
}
===}}}

Без паники в zoo() пишет 1 1, с вызовом - Caught something и 0 -1.
Hу да, кривовато - если нужно передать больше параметров, надо какой-то
объект для хранения ошибки передать, return верхнего уровня из такого recover
как-то не получается(?), но худо-бедно работает.

NA> Ладно у меня утилитка, и я бы и
NA> сам бы ничего умнее не придумал, чем выйти, но а если я сервер мать
NA> его пишу высоконагруженный, как во всех этих гоу рекламмах, какой он
NA> классный...

Паника, похоже, дороже возврата значения. Hо всё равно ловится.


-netch-

... Кто здесь?????
Nil A
2021-11-11 23:17:40 UTC
Permalink
Hello, Valentin!

Thursday November 11 2021 23:23, from Valentin Nechayev -> Nil A:

NA>> Так вот, пейшу я ту на Go. А в Go, как вы знаете, нету
NA>> исключений.
VN> Есть, возбуждаются через panic, ловятся через recover.
VN> Hу а что они не называются при этом исключениями и ловятся слегка
VN> через оппу - вопрос к двуличным разработчикам.

Ага, как раз недавно про это прочитал.
Есть драфт дизайн Go 2, там всё крутиться вокруг обработки ошибок, что такое
типа ошибки вообще и ещё про дженерики
https://go.googlesource.com/proposal/+/master/design/go2draft.md

VN> Паника, похоже, дороже возврата значения. Hо всё равно ловится.

Дык в C++ exceptions тоже сильно дороже стоят, чем просто возврат значения.
Поэтому их стоит употреблять как исключения, а не как то, как одно из значений,
которое функция может возвращать.
На другом конце спектра, например, Python, который кидает StopIteration
исключение, для обозначения конца итератора.

Про Гоу. Так ничего язычёк, только совсем мало в функциональном стиле можно
писать. Не хватает питоновского list comprehension, а также просто, чтобы map,
zip,.. можно было в одну строчку писать.
Я прочитал умных книг по современному C++, и уже не помню когда последний раз
писал new/delete руками, только в одно хитром месте писал new placement. Я к
тому, что я теперь если вижу цикл какой-то, то у меня уже руки чещутся на
какой-нибудь стандартный алгоритм из <algorithm> заменить.

Best Regards, Nil

Loading...