Rust での unwrap, expect, panic, assert 周辺の話

unwrap, expect, panic!, assert! をいつ使うべきか、どういう意味で読んでいるか等。 雑にツイット集めただけなので誰か整理してくれ〜
3
前へ 1 ・・ 5 6 次へ
Ryusei @mandel59

「panic は回復不可能なエラーを意味する」。それはそう。じゃあ、回復不可能なエラーでない、ただのエラーだったり、未実装な機能を使おうとしただけだったりするなら、それは(panicで表現することもできるけど)panicで表現するべきじゃないよね、そういうことを私は言っています。

2020-12-22 18:02:26
らりお・ザ・.*🈗然㊌㋞㋰㋷㋓ @lo48576

はい。ただのエラーだったり未実装だったりは panic で表現するべきでないと思います。 (unimplemented!() や todo!() が production code に表れるべきでないという clippy lint はその思想によるもののはずなので)

2020-12-22 18:03:54
電波猫 @dempacat

panicは結構気軽に使ってしまう。Vecでアロケーションミスったときpanicするのやめろ、という議論はどっかにあった気がする。

2020-12-22 18:04:26
Ryusei @mandel59

Rust使いたいってことは極力型システムを使い倒したい人な気がするんだけど

2020-12-22 18:04:39
らりお・ザ・.*🈗然㊌㋞㋰㋷㋓ @lo48576

ただし、「仕様として許されていない利用方法 (理屈の上では回復可能) が発生したとき」の扱いについて私の考えは違っていて、「利用先ライブラリの仕様に従えなかった時点で、利用元 (ユーザコード) もまた暗黙に仕様違反している」という認識なので、それは panic でいいんじゃない?という考え

2020-12-22 18:05:12
トデス子'\ @todesking

みんな仕様を表現できるほどリッチな型システム使ってないのでは???

2020-12-22 18:06:44
らりお・ザ・.*🈗然㊌㋞㋰㋷㋓ @lo48576

「ライブラリを利用するとき、利用先ライブラリの仕様や制約を遵守する」というのはユーザコードの暗黙の仕様として当然存在していると考えて良いと思うんですよね。 逆に言えば、仕様違反の方法でライブラリを利用するようなコードは実装時点から既に壊れていて、それは実行時に「回復可能」ではない

2020-12-22 18:06:47
Ryusei @mandel59

あー、まあそうだよね 範囲外アクセスとか、そういうのはそうだよね

2020-12-22 18:06:53
電波猫 @dempacat

panicするかしないかも含めて、仕様の一部だと捉えている。仕様策定の指針として、復帰可能なものは極力panicせずエラーを返せ、というのはあるし、そうすべきだが、復帰可能と捉えるか否かは、実際に復帰可能かどうかではなく、仕様を作る人の判断になるかと。

2020-12-22 18:07:30
らりお・ザ・.*🈗然㊌㋞㋰㋷㋓ @lo48576

厳密な意味では「回復可能」かもしれないけど、壊れたコードが自身が壊れているか否かを正しく判断できるという想定はだいぶナンセンスな気がします。そんな判断コードがあるくらいなら実装を修正しろという話なので。

2020-12-22 18:08:22
Ryusei @mandel59

いや自分も仕様を完全に型システムで表現するべきだという主張をしているわけじゃなくて、無理のない範囲で表現して表現できない部分はpanicでぜんぜんいいと思うしそう言っているんですが

2020-12-22 18:08:42
KOBA789 @KOBA789

定義域がドキュメントに書いてあるなら定義域外の引数には全部 panic で返していい

2020-12-22 18:09:05
電波猫 @dempacat

仕様を作る人の判断に「なる」というのは、無知ゆえになってしまうという意味(だけ)ではなく、「できる場合もあるにはあるかもしれないし、ユースケースもあるにはあるかもしれないけれど、それは考えない」という判断もあってもよい、という意味。

2020-12-22 18:09:07
denjiry @denjiry

panic系列も別の型にして特別扱いするとかするのよさそう?

2020-12-22 18:09:34
Ryusei @mandel59

どの程度まで型で表現してどこからが無理かってのが人によって感覚が違っているから、そこで判断は分かれると思います……

2020-12-22 18:09:41
らりお・ザ・.*🈗然㊌㋞㋰㋷㋓ @lo48576

暗黙の nullability では飽き足らず暗黙の crashability なる概念が (?)

2020-12-22 18:10:38
Ryusei @mandel59

たとえば配列の範囲外アクセスエラーとかも、配列を添え字でアクセスしようとするから発生するわけで、エラーが起こらないインターフェースを使うのがそもそも望ましいですよね

2020-12-22 18:11:06
らりお・ザ・.*🈗然㊌㋞㋰㋷㋓ @lo48576

まあ真面目な話をすると、それって本来はエラーの有無や例外の有無に近い方法で表現されていた気がしていて、なんか同じことを二重に抽象化している気がする

2020-12-22 18:11:31
Ryusei @mandel59

(Rustのunsafeは使い方が決まっているというか、panicを起こすだけならunsafeではないですけど、panicが起きうる関数も極力分かるようになっていてほしい……)

2020-12-22 18:12:29
denjiry @denjiry

indexをなくしてget系列にするべきなのは賛成できる(Elmもそう)

2020-12-22 18:13:02
Ryusei @mandel59

型システムで完全性を保証できないからpanicがあるわけで、panicが起きるかどうかを型システムで知ることはできないわけですが

2020-12-22 18:13:13
KOBA789 @KOBA789

うまく型パズルすればパニックが起きないように組める場合でも、変更のしやすさとかの観点から実行時に panic するように書くことはある(実装がバグってない限りは panic することはないが)

2020-12-22 18:13:21
らりお・ザ・.*🈗然㊌㋞㋰㋷㋓ @lo48576

panic の有無、型レベルでどう表現されるべきかピンとこない。 一応 RFC 1574 で「パニックしうるなら Panics セクションをドキュメントに用意しようね」とは言われているが、これは仕様上明示される panic。 1574-more-api-documentation-conventions - The Rust RFC Book rust-lang.github.io/rfcs/1574-more…

2020-12-22 18:14:59
らりお・ザ・.*🈗然㊌㋞㋰㋷㋓ @lo48576

「内部的なバグの検知としての、本来起きえない panic」が起きるかどうかをドキュメントや型で明示するというのは……うーん そもそも起きえないものなので明示してもしゃーない気はする。 関数に「未知のバグがある可能性があります」と但し書きするくらいにナンセンスな感じ。

2020-12-22 18:15:54
Ryusei @mandel59

型で表現できないからpanicがある 絶対にpanicを起こして値を返さない場合は ! で表現する panicを起こすかもしれない、ということを型で表現することはできない

2020-12-22 18:16:46
前へ 1 ・・ 5 6 次へ