Go: 提案「iferr= nil」をそのたたにしたすか

䜜成日 2019幎06月28日  Â·  314コメント  Â·  ゜ヌス: golang/go

Go2提案32437は、蚀語に新しい構文を远加しお、 if err != nil { return ... }ボむラヌプレヌトの煩わしさを軜枛したす。

さたざたな代替案がありたす。元の提案は普遍的に愛されおいないため、32804ず32811です。

ミックスに別の遞択肢を投げるにはそのたたにしおみたせんか

if err != nil構造の明瀺的な性質が奜きになったので、このために新しい構文が必芁な理由がわかりたせん。 本圓にそんなに悪いの

FrozenDueToAge Proposal Proposal-Hold error-handling

最も参考になるコメント

物事を行う方法は1぀だけでなければなりたせん

党おのコメント314件

私はこれを2番目にしたす。 すべおの゚ラヌを返す前に装食するこずで、人間が読める圢匏のドキュメントを゜ヌスに远加する方法通垞、゚ラヌを「[これらのコヌド行で行っおいるこず][前の゚ラヌ]」ずしおフォヌマットできたせんでしたずナヌザヌに非垞に気に入っおいたす。読み取り゚ラヌ。

この方法で生成された゚ラヌは非垞に有益であり、スタックトレヌスよりもはるかに読みやすくなっおいたす。 スタックトレヌスを含む印刷された゚ラヌは、通垞、゜ヌスにアクセスする準備ができおおり管理者はそのようなアクセス暩を持っおいない可胜性がありたす、実際にコヌド内の方法を知っおいるこずを前提ずしおいたす。

コンテキストやトレヌスの圢匏がない゚ラヌ裞の文字列「EOF」はたったく圹に立ちたせん。 裞の゚ラヌを簡単に返すこずができるショヌトカットがあるず、Goプログラムは倚くの圹に立たない゚ラヌを出力するようになるず思いたす。

どちらかずいえば、おそらく新しい獣医ずリントのルヌルを䜿甚しお、コンテキストで゚ラヌを装食するこずをプッシュしおサポヌトする必芁がありたす。

明瀺的な゚ラヌチェックも気に入っおいたす。 tryは玛らわしく、暗黙の戻りは奇劙です。

゚ラヌを再考する代わりに、これらのチェックを短くするための別のアプロヌチを詊すこずができるず思いたす。

これは私が必ずしも同意しない䟋です

value, err := foo()
return err if err != nil

これにより、より短いが明瀺的なアプロヌチが可胜になりたす。 そしお、それはコンテキストを远加するこずを可胜にするでしょう

ずは蚀うものの、むンラむンifはRubyのものであり、あたりゎむッシュな感じはしたせんが、これは単なるブレむンストヌミングです。 倚分私たちは䜕か他のものを芋぀けたす。


線集私はここにこれに関する提案を远加したした https 

物事を行う方法は1぀だけでなければなりたせん

[...]そのたたにしおみたせんか

私たちは皆、これに察する答えを知っおいるず蚀っおも過蚀ではないず思いたす。 心からわからない堎合は、さたざたな提案の1぀を読んで答えを芋぀けるだけです。

IMO、ここでは詳现が少なすぎお焊点を絞った議論をするこずができず぀たり、提案ずしお適栌ではないず思いたす、すぐにサヌクルゞャヌクずコヌドを読みにくくするアむデアでいっぱいの別の自転車小屋に倉わりたす。

これだけ。

間違いなく、この明瀺的な゚ラヌ凊理のためにGoに参加したした。 これは、倚くの蚀語が䜿甚する暗黙のtry-catchず、ナヌザヌに返され明瀺的に凊理されるこずを奜むOptionやMaybeなどの関数タむプの間のどこかにありたす。

新しい構成が本圓にこれを解決するかどうかはわかりたせん。 if err := nilをこのようなヘルパヌ関数でラップするず、少し圹立぀かもしれたせん私のさびたGoを蚱しおください

func handleErr(err error, cb func(error)) {
        if err := nil {
                cb(err)
        }
}

しかし、このヘルパヌ関数の䞀般的な有甚性を䜎䞋させる問題は、別のトピックである型システムです。

私はこれを2番目にしたす。 if err != nil { return err }は、コヌドベヌスのコヌドの䞀郚ではありたせん。 したがっお、「マクロ」を詊しおみおもたったく意味がありたせん。 コンテキストを説明するメッセヌゞずずもに、ラップされた゚ラヌのみを返したす。

異なる皮類の゚ラヌを区別するために異なる゚ラヌメッセヌゞを返したいので、deferを介しおコンテキストを远加するこずも意味がありたせん。 ただし、 try(fn(), "my error message: %w")が圹立぀堎合がありたす。 ただし、それでも、行の長さが短いため、 if err != nil構造の方が望たしい堎合がありたす。

率盎に蚀っお、 try提䟛する暗黙のリタヌンは必芁ありたせん。 ゞェネリックスがある堎合は、代わりにモナド颚の動䜜を䜿甚する゜リュヌションをお勧めしたす。

type Result<T> interface {
  Expect(err error) T
  OrElse(defaultValue T) T
}

func From<T>(value T, err error) Result<T> { ... }

私にずっお、これは珟圚提案されおいるビルトむンよりもはるかにクリヌンですが、返されるメ゜ッド倀、゚ラヌず結果が急増するため、䞊蚘にさらに倉曎を加える必芁がありたす

゚ラヌを明瀺的に装食する方法がない珟圚のtry提案は、私のニヌズを満たしおいたせん。 私はそれを䜿うこずを想像するこずはできたせん。 率盎に蚀っお、それはcode_smellず呌ばれるこずもありたす。

間違った問題を解決しようずしおいるため、倉曎しおも意味がない堎合がありたす。

私たちが粟通しおいるコヌドぱラヌ凊理ではありたせん。

if err != nil {
  return err
}

これぱラヌnil凊理です。 このパタヌンのどの時点でも、゚ラヌの倀は凊理されたせん。

これを別の蚀語、Rubyでデモンストレヌションする堎合。

begin
 some_method_that_raises_an_error
rescue => e # catch any exception
  retry e        # throw it up again
end

これは、golangコヌドず同じ動䜜を䞭継したす。 䟋倖が発生したこずを怜出し、それを再発生させたずき。 スタックに投げるだけです。

golangでは、 returnです。

実際の_゚ラヌ凊理_はどこで発生しおいたすか

私たちは皆、このパタヌンの倱敗に぀いお同様の経隓をしたした。 たずえば、 file not found゚ラヌを受信し、この゚ラヌの元の_thrower_をトレヌスするのに長い時間を費やしたす。

これが、 try提案およびその他に誀りがあるず私が信じる理由です。 実際に゚ラヌを凊理するための適切なパタヌンはありたせん。

実際に゚ラヌを怜査するためのerr.Error()文字列チェック、型アサヌションなどを確認したした。
この䞍䞀臎のパタヌンが必芁です。 xerrsがこれを解決しおいるように感じたすが、ただ完党ではありたせん。

err= nilチェックをそのたた維持するこずをサポヌトしたす。

かなり倧きなGoコヌドベヌスを掘り䞋げるたびに、ボむラヌプレヌトの䞀郚を枛らす方法を自問したす。 私はい぀も戻っおきたす

  • これらのコヌドパスは、䜕らかの圢で存圚したす。
  • コヌドパスを非衚瀺にする必芁がない堎合でも、コヌドパスを非衚瀺にする機䌚をナヌザヌに䞎えるず、デフォルトの動䜜になりたす蚀語の䜿甚の難しさを行数で枬定しおいるようです。
  • デフォルトの動䜜でコヌドパスが非衚瀺になっおいる堎合は、新しい「クリヌンアップがない」バグを探しおいたす。
  • 返される゚ラヌの意味ずパタヌンは十分に倚様であるため、この提案では認識された問題の䞀郚しかキャプチャされたせん。
  • 䞀郚だけがキャプチャされた堎合、私たちは確かにたくさんの解決策を埗るでしょう
  • たくさんの解決策があるず、それらをロヌルアップするためのナヌスケヌスの適応魔法を持ちたいずいう誘惑が生たれたす。
  • これが実際に問題であった堎合、人々は自由に独自の簡単な解決策を䜜成したり、倧量に採甚されたパタヌンを䜿甚したりできたす。 私はそのようなものを芋たこずがありたせん。 たぶん私は十分に䞀生懞呜に芋えおいたせん。

課題トラッカヌは倚くのこずに圹立ちたすが、圹に立たないこずの1぀は、耇雑なトピックの詳现な説明です。 課題トラッカヌはスレッド化を提䟛せず、特定のメッセヌゞぞの返信は厄介です。 ここには実際の提案はなく、他の提案ぞの回答に過ぎないので、この議論をgolang-nutsメヌリングリストに持ち蟌むこずを匷くお勧めしたす。

可胜であれば、これが答えだず思いたす。 この新しい゚ラヌ提案は、蚀語の目暙ず盎接矛盟しおいたす。

私がgolangを愛する理由は、その単玔さず制埡フロヌの明確な䜿甚のためです。 私がJavaに぀いお最も軜蔑しおいるこずの1぀は、trythrowコンストラクトです。 それはずおも嫌です。 それはひどい゚ラヌ凊理を助長したす。 コヌルスタックに䟋倖を送信するこずは、制埡フロヌを凊理するための恐ろしくお嫌な方法です。 さらに、自己文曞化しお各゚ラヌ状況を明瀺的に凊理するのではなく、すべおを巚倧なチェックでラップしお1日ず呌ぶこずをお勧めしたす。

err= nilが適切な゚ラヌ凊理を促進し、自己文曞化であり、特定のケヌスに関する適切な文曞化を促進する堎合、正盎なずころ、これは私がgoで最も気に入っおいるこずの1぀です。 この新しい制埡フロヌの割り蟌みを、乱雑でややあいたいな戻り倀ずパラメヌタヌを䜿甚しお䜜成し、セマンティクスを混乱させるこずは、私が愛するようになった蚀語の粟神ではありたせん。

冗長性は悪いこずではありたせん。 䞍必芁な冗長性はありたすが、goの゚ラヌ凊理は䞍芁ではないず私は䞻匵したす。 それは蚀語の魅力の䞀郚です。

これ以䞊同意できたせんでした。 明瀺的な゚ラヌ凊理は、IMO蚀語の最も優れた機胜の1぀です。 気になる人はただ慣れおいない気がしたす。

問題が分かれおいるのは良くありたせんが、今回は2぀の意芋が1぀の意芋にたずめられおいるず思いたす。

  1. 新しい構文は奜きではありたせんtryたたは新しいif-err構文
  2. ずにかく、新しい構文を远加したくありたせん

GitHubの投祚アむコンは2番目を解釈できたせん。

goでの明瀺的な゚ラヌ凊理は、私がgolangを愛する理由の1぀です。 なぜgo開発者が他の方法でそれを望んでいるのか理解できたせん。 新しい構文を远加するずいう提案は、ほずんどの堎合、他の蚀語で䜿甚されおいる構文を快適に䜿甚できる人々からのものだず思いたす。 慣れるたで少し時間がかかるかもしれたせんが、慣れれば完璧に動䜜したす。

私は32811を曞き、この提案をもっず支持したす...゚ラヌ凊理はそのたたにしおおきたいです。 この提案に察する絵文字の反応は倚くを語っおいるず思いたす。

私は個人的に、゚ラヌ凊理をそのたたにしおおくこずに同意したす。 Goに぀いお私が気に入っおいるこずの1぀は、蚀語が最小限であり、䞀般的に蚀えば、物事を行う1぀の方法があるこずです。 ゚ラヌ凊理甚の新しい構文を远加するこずで、コヌドのxが珟圚のメ゜ッドを䜿甚し、yが新しいメ゜ッドを䜿甚する䞖界を䜜成したす。 これは、すでに説明した他の問題の䞭でも、䞀貫性のないコヌドベヌスを䜜成したす。 個人的には、既存の構文が十分/十分であるず考えおいるため、新しい゚ラヌ凊理構文の䟡倀はトレヌドオフの䟡倀があるずは思いたせん。

Golangを初めお䜿甚する人ずしお、この蚀語に぀いお私が新鮮に感じるこずの1぀は、明瀺的な゚ラヌ凊理です。 私はJava、Ruby、Python、Nodeでかなり重く働いおきたしたが、゚ラヌの凊理はGoよりもはるかに面倒です。 ゚ラヌをより曖昧にする蚀語構造によっお暗瀺されるよりも、゚ラヌの明確な「パス」を芋たいず思いたす。

ˋreturn ... if ... ˋ @ andreyneringからの提案は実際にはかなり賢い私芋です。 ボむラヌプレヌトワンラむナヌを削枛しおいる間、コヌドを明瀺的に保ちたす隠れた制埡フロヌの䞭断はありたせん。 。

同意したす。 if err != nilはそのたたにしおおきたす。

私は珟圚のフォヌマットを奜みたす。 明確で教えやすいパタヌンです。 新しい゚ンゞニアをスピヌドアップさせるのは簡単です。圌らは1぀の単玔なパタヌンを孊び、それを繰り返すこずができるからです。 たた、少なくずも珟圚のコンテキストで゚ラヌを考慮するようにナヌザヌに求め、少なくずも゚ンゞニアがここで゚ラヌが発生する可胜性があるこずを認識しおいるこずを確認したす。私は䜕をすべきかを考える必芁がありたす。

私は32804を曞きたしたが、物事が倉わらないこずを望んでいたす。 コヌドが長い堎合、それは倚くのこずを行うためです。 ゚ラヌ凊理コヌドがたくさんある堎合、それはすべおのケヌスをうたく凊理しおいるためです。

物を远加するためだけに物を远加しないでください。

゚ラヌ凊理のシンプルさをそのたた楜しんでいたす。

Expectは、を陀いお単なるアナグラムであり、私はそれを䜿甚したくありたせん。 これを始めおくれおありがずう。

私の聖杯を倉えないでください。

より合理化された゚ラヌ凊理を芁求する圧倒的なコミュニティフィヌドバックがありたした幎次調査から。 Goチヌムは珟圚その問題に取り組んでいたす。

@icholyもちろんですが、珟圚の提案には

1぀の䞍満はそれを入力しなければならないこずでしたが、事実䞊すべおの゚ディタヌにはコヌドスニペットを挿入するためのショヌトカットがあるので、それは実際には倧したこずではありたせん。 おそらく、1.0より前からGoを䜿甚したのは私自身の経隓ですが、私はたたたたシンプルさが奜きで、冗長性を気にしたせん。

@kevineaton tryは耇雑だず思いたすか

私はこれに完党に同意したす。 私は私たちが䜕かをする必芁があるず個人的にさえ確信しおいたせん-私はif err != nilチェックが䞀芋ぎこちなく芋えるこずに同意したすが、実際に問題を解決する提案されたものを芋たこずがありたせん。に人気がありたす。

@icholy Goの前にJavaずPythonを10幎間曞いた埌、そうなる可胜性があるず思いたす。 ポケモンの䟋倖キャッチ、たたは耇数の䟋倖のキャッチチェヌンに遭遇したず思いたす。そうでなければ、さらに倚くのオヌバヌヘッドず定型文が導入されたす。 ゚ラヌ凊理を回避できれば、そのスタむルの゚ラヌ凊理に戻るこずはありたせん。ほずんどの堎合、特に教えるずきに頭痛や混乱を招くからです。 私はたた、゜フトりェアアヌキテクトずしおの日々の仕事に加えお、コンピュヌタヌサむ゚ンスを教えおいるので、新しい開発者を教えたり、指導したりするこずに偏っおいたす。 私はGoを遞択したす。これは、より耇雑で埮劙な゚ラヌ凊理よりも、単玔な゚ラヌ凊理です。

課題トラッカヌは倚くのこずに圹立ちたすが、圹に立たないこずの1぀は、耇雑なトピックの詳现な説明です。

それは真実ではありたせん。 しかし、ここにありたす。

if err != nil tryが远加されおも、 if err != nilは消えたせん。 tryは、゚ラヌ転送が重いか、1぀の遅延゚ラヌハンドラヌで倚くの異なる゚ラヌを簡単にたずめるこずができるコヌドパスにある皋床の明確さを远加するず思いたす。 。 try 、空のif-err-return-err束よりもはるかに倚くの゚ラヌを凊理しないように促す方法がよくわかりたせん。 tryが存圚するかどうかに関係なく、実際に゚ラヌを凊理するこずを無芖するのは簡単です。 tryは、それを䜿甚しおいるコヌドが読みやすいように芋えるので、゚ラヌ凊理の最良の提案の1぀だず思いたす。

私の䞀方的な2セント、それはあたり「行く」ように感じたせん。 それはあたりにも魔法であり、明瀺的なものよりも暗黙的な構成を採甚したす。

GoFAQから

Goに挔算子がないのはなぜですか
_Goには3項テスト操䜜はありたせん。 同じ結果を埗るには、以䞋を䜿甚できたす。_

if expr {
   n = trueVal
} else {
    n = falseVal
}

がGoにない理由は、蚀語の蚭蚈者が、操䜜が頻繁に䜿甚されお、䞍可解に耇雑な匏を䜜成するのを芋おいたためです。 if-else圢匏は、長くなりたすが、間違いなく明確です。 蚀語に必芁な条件制埡フロヌ構造は1぀だけです。

@ianlancetaylor

課題トラッカヌは倚くのこずに圹立ちたすが、圹に立たないこずの1぀は、耇雑なトピックの詳现な説明です。 課題トラッカヌはスレッド化を提䟛せず、特定のメッセヌゞぞの返信は厄介です。 ここには実際の提案はなく、他の提案ぞの回答に過ぎないので、この議論をgolang-nutsメヌリングリストに持ち蟌むこずを匷くお勧めしたす。

特定のメッセヌゞに返信できたす。 私はあなたに返信したした。 :)

ここには実際の提案はないので、他の提案ぞの返答だけです。

私ぞの提案は、倉化の呌びかけを意味したす。 この特定の問題は反倉化です。 ゚ラヌ凊理を倉曎しないずいう提案を䜜成するこずを提案したすか 提案䜓制は玠晎らしいず思いたすが、珟状は過小評䟡されおいたす。

JavaずPythonの䜜成に10幎を費やした埌、゜フトりェアアヌキテクトずしおの日々の仕事に加えお、コンピュヌタヌサむ゚ンスも教えおいたす。

@kevineatonあなたはあなた自身のディックを吞うこずを

この問題は、基本的に誰でも簡単に提案に賛成たたは反察祚を投じるこずができる半公匏の堎所での長期にわたる䞖論調査ずしお機胜したす。

if err != nilを削陀するために蚀語を倉曎しないこずは、基本的に远加の詳现を必芁ずしない完党に倧げさな提案です。 䜕が問題なのかわかりたせん。 いいえ、それはひどく長くお、しゃがむのが難しい神ではありたせん。 それはそれを間違ったり、悪くしたり、䞍十分にしたりするものではありたせん。

+1、これ以䞊良いこずはないにしおも、本圓に良いスタックトレヌス情報フレヌムダンスのものなしになるでしょう、 x/errorsすでにこれを達成しおいるず思いたすが、近い将来、マヌキングのような迅速なものが倧奜きですfuncは、 error + tryキヌワヌドを返すthrowsキヌワヌドを䜿甚しお、゚ラヌ倉数のシャドりむング私は個人的に嫌いですを防ぎたす。

func a() (int) throws {
  throw &someError{}
}

anInt, err := try a()

@icholyそれは信じられないほど求められおい

珟圚の゚ラヌ凊理は、人為的゚ラヌが発生しやすいものです。 珟時点でerrをチェックするのを忘れるのは簡単です。 スコヌプ内にすでにチェックがある堎合そしおほずんどの堎合、コンパむラヌはunused variable終了したせん。 ゚ラヌ凊理は厳密である必芁がありたす-゚ラヌを_するか、チェックしたす-レッグシュヌトは䞍可胜です。

@kevineaton tryは耇雑だず思いたすか

tryはコヌドの臭いです。 これにより、1぀の堎所だけでなく、コヌドのブロック党䜓にむンデントが匷制されたす。 さらに、䟋倖凊理の「バブルアップ」の性質により、コヌドおよび耇数の出口点で事実䞊の非決定論的な動䜜が発生したす。

try代わりに耇数の戻り倀を䜿甚するこずの利点は、関数が完了したずきにチェックする倀が1぀ず、関数からの終了点が1぀あるこずですもちろん、ガヌドステヌトメントやその他の明瀺的な戻り倀を䜿甚する堎合を陀く。

tryブロックは、耇数のリタヌンずいうク゜の目的党䜓を打ち負かしたす。

@fillestコヌドが少し読みにくくなりたすが、これは安党性/明瀺的な゚ラヌ凊理の芳点から付加䟡倀になるず思いたす。 Goで゚ラヌを凊理する方法の圓初の目暙を振り返るず、明瀺的な善の粟神を远求しながら、匕甚するバグのクラスを回避するための良い反埩になるず思いたす。

珟圚の゚ラヌ凊理は、人為的゚ラヌが発生しやすいものです。 珟時点で゚ラヌをチェックするのを忘れるのは簡単です。 スコヌプ内にすでにチェックがある堎合そしおほずんどの堎合、コンパむラヌは未䜿甚の倉数で終了したせん。 ゚ラヌ凊理は厳密である必芁がありたす-゚ラヌを_゚ラヌたたはチェックしたす-レッグシュヌトは䞍可胜である必芁がありたす。

@fillest提案された゚ラヌ凊理の倉曎により、「レッグシュヌティング」が容易になり、゚ラヌは遅延凊理できるため、より顕著になりたす。

ゞェネリックスの欠劂、ボむラヌプレヌトの傟向、GC、リ゜ヌス制限/アカりンティングの欠劂、およびコンパむラヌの機胜を理解しおいないPHP初心者から生成されたワヌクロヌドのためにGoの䜿甚をやめたした。 Haskell、Cなどぱラヌ凊理をかなりうたく解決したした... Go 2の提案は、以前のように明瀺的なケヌス凊理があれば問題ないように芋えたす䞍明。

゚ラヌ凊理はプログラミングの䞭心です。 ビゞネスロゞックのモデリング耇雑ですがは、このロゞックが生成する無効な条件に察応するよりも垞に簡単です。 ゚ラヌを転送するだけでは、コヌドの臭いがしたす。 Goがこの動䜜を奚励しないが、゚ラヌ管理パタヌンを促進するこずを望みたす。 初心者は、䞭倮の゚ラヌ管理がいかに重芁であるかを理解しおいないため、このすべおの゚ラヌ凊理コヌドず混同されるこずがよくありたす。

tryビルトむンぱラヌをラップしお少しでも情報を远加するのに圹立たないので、完党に同意したす。

try曞き換える前に

_, err := doSomething()
if err != nil {
    return nil, errors.Wrap(err, "failed to do something")
}

_, err = doOtherThing()
if err != nil {
  return nil, errors.Wrap("failed to do the other thing")
}

try曞き盎した埌の様子を想像しおみおください。

try 、匕数を括匧で囲むこずにより、すでに1匕数関数のように機胜するため、゚ラヌラッピングコヌドである2番目の匕数を受け入れるこずができたす。

try(extract_value(try(get_data(1), errors.Wrap(err, "failed to get data")), errors.Wrap(err, "failed to get data")))

err倀を暗黙的に導入する必芁がある堎合衛生的な方法で。 次に、 tryが1匕数関数ずしお䜿甚される堎合、゚ラヌは倉曎されずに返されたす。

私は同意したす、゚ラヌ凊理を少し簡単にするかもしれない唯䞀の「シンタックスシュガヌ」は、関数から耇数のリタヌンがあるずきに次のようなこずをさせおくれたす...アンダヌスコアはリタヌンタむプが䜕であれデフォルト倀になりたす

if err != nil {
    return _, _, err
}

@sorenvonsarvortそれは

var errContext string 

defer func() {
  // err is a named return
  if err != nil {
    err = fmt.Errorf("%v: %w", errContext, err)
  }
}()

errContext = "failed to do something"
_ := try(doSomething())

errContext = "failed to do other thing"
_ := try(doOtherThing())

私の理解では、コヌドの特定のセクションが明確であれば、 if err != nil { ... }䜿甚するこずもできたす。

tryは他の堎合に茝きたす。 次のようなものを想像しおみおください。

func trySomeComplexOp() (r result, err error) {
  a := try(step1())
  b := try(step2(a))
  c, d := try(step3(b))
  return try(lastStep(c, d)), nil
}

䞊蚘のコヌドのようなコヌドは、 if err != nilブロックを振りかける必芁がある堎合よりもはるかにクリヌンになる可胜性がありたす。 Goは「線圢の読みやすさ」がすべおなので、 tryはその目的に向かっおうたくいくず思いたす。

より合理化された゚ラヌ凊理を芁求する圧倒的なコミュニティフィヌドバックがありたした幎次調査から。 Goチヌムは珟圚その問題に取り組んでいたす。

これはボヌカルのマむノリティであり、それらのかなりの郚分がGoを䜿甚しおいないに違いありたせん。

@sirkonその声明の根拠は䜕ですか

@sorenvonsarvortそれは

䞊蚘のコヌドのようなコヌドは、 if err != nilブロックを振りかける必芁がある堎合よりもはるかにクリヌンになる可胜性がありたす。 Goは「線圢の読みやすさ」がすべおなので、 tryはその目的に向かっおうたくいくず思いたす。

ロシアでは、これを「экПМПЌОяМаспОчках」ず呌んでいたす。 意味を理解するためにグヌグル翻蚳を䜿甚しおください。

ただ読んでいないこのスレッドの人には、元のtryプロポヌザルの問題に関するこのコメントを読むこずをお勧めしたす。 䞀般的な゚ラヌコンテキストのベストプラクティスず、それがtryどのように衚珟されるかに぀いお説明したす。

おそらく、Goコミュニティでぱラヌコンテキストが少し独断的になっおいるず思いたす。 私は個人的にこれに陥り、゚ラヌを過床に文脈化しお、非垞に長く、反埩的で、読みにくいメッセヌゞをもたらしたこずを知っおいたす。 ゚ラヌをコンテキスト化するタむミングずしないタむミングに関しおは、倚くのニュアンスがありたす。

tryは基本的にショヌトカットであり、ボむラヌプレヌトコヌドを枛らすこずが奜きです。 ただし、゚ラヌを远加情報でラップする機胜は倱われたす。 ただし、次の倉曎で修正される可胜性がありたす。

f := try(os.Open(filename))

になりたす

f := try(os.Open(filename), "open data file")

もちろん、それ以䞊のこずをする必芁がある堎合でも、 err != nilチェックを行う「完党な」方法は匕き続き利甚できたす。

私はこれに同意したすが、最終的な意芋を述べる前に、倉曎に぀いおより倚くの経隓を積むずいうゎヌチヌムからの芁求を尊重したす。

しかし、倉曎に関する私の予備的な経隓は、それが本圓に䞍必芁であるこずを支持しおいるようです。 私はそれぞれ玄1䞇行の2぀の「珟実䞖界」のプログラムを持っおおり、䞡方でわかりたす。 これは、どちらも垞に゚ラヌにコンテキストを远加するずいう事実によっお簡単に説明されたす。 Goには他にも小さな「おもちゃ」プログラムがあり、 tryhardは、そのうちの1぀でtryを䜿甚できたケヌスを1぀芋぀けたしたが、それだけです。

他の人が私ずは異なる方法で゚ラヌを凊理する可胜性があるこずを認め、 tryを積極的に䜿甚できる可胜性を認めたす。 tryhard゜ヌスコヌド自䜓には、 return err連続したケヌスがいく぀かありたす。これは、 tryを䜿甚した堎合、読みやすさがそれほど損なわれるこずはないず思いたす。 しかし、誀甚は読みやすさに圱響を䞎えるので、私は誀甚を恐れおいたす。 良い䟋がここにありたす。 そしお、䜕が良い䜿い方かを刀断するこずは、たったく別の話になりたす。

たた、自分でプログラムを実行しなくおも、通垞はgoコヌドを読み取るこずができる方法が奜きです。 これにより、特に他の蚀語で芋た他のtryずは異なるこずを行うため、 tryが行う魔法を孊ぶ必芁がありたす。 これは、この蚀語を初めお䜿甚する人にも圓おはたりたす。これは、「必芁な機胜だけ」を備えおいるこずでシンプルであるこずに誇りを持っおいる蚀語で孊ばなければならないもう1぀の機胜です。

埅っお芋おみたしょう。 私はこの倉曎をもっず実隓する぀もりですが、それが私の立堎を倉えるずは確信しおいたせん。

より合理化された゚ラヌ凊理を芁求する圧倒的なコミュニティフィヌドバックがありたした幎次調査から。 Goチヌムは珟圚その問題に取り組んでいたす。

@icholy私が蚀ったように、私ぱラヌにコンテキストを远加するのが奜きです。 その点で、私にずっお「より合理化された゚ラヌ凊理」ずは、そのコンテキストを提䟛し、そこから情報を取埗するためのより良い方法を意味したす。 たずえば、゚ラヌに远加したすべおのコンテキストで、゚ラヌの原因がタむムアりトであるかどうかを「コンテキスト」に尋ねるのは簡単なはずです。 しかし、そうではありたせん。 通垞、 pkg/errorを䜿甚するか、独自の「゚ラヌ構造」を䜜成するか、実装によっおは文字列怜玢を実行できるメ゜ッドを䜜成する必芁がありたす。 せいぜいたたに1぀のifを節玄するものよりも、構造䜓やメ゜ッド党䜓を䜜成するこずから私を救う䜕かを芋たいず思いたす。 そしお、以前に蚀われたように、この倉曎が基本的に゚ラヌを実際に凊理しないためのより䟿利な方法を提䟛しおいるずき、それを本圓に「゚ラヌ凊理」ず呌ぶこずができたすか

tryは耇雑だず思いたすか

単独でtryは耇雑ではありたせんが、蚀語の倉曎は単独では考慮されたせん。 怜蚎

  • 新しいビルトむンのセマンティクスを孊習するこずによる認知的負荷の増加
  • if err != nil {return ... errors.Wrap() }を代わりに䜿甚する必芁がある堎合に、 tryを䜿甚するず読みやすさが䜎䞋するため、読みやすさが䜎䞋したす。

゚ラヌをチェックする簡単な方法よりも、単玔さ゚ラヌをチェックする単䞀の方法を持぀の方が重芁であるずいう感情を䞊に繰り返したす。

゚ラヌを凊理する方法は、そのグロヌバルステヌトメントを䜿甚するこずではありたせんか。これが無芖されるものである堎合、パニック状況はどのように凊理されたすか 他のプログラミングパラダむムが今日゚ラヌを凊理するので、より良い゚ラヌ凊理をサポヌトしたすが、無芖しないでください

try提案に問題はありたせんか
叀い動䜜を䜿甚したい堎合、たたは他の方法で゚ラヌを凊理する必芁がある堎合は、叀い方法を再利甚しおみたせんか try構文を䜿甚しおいる銖を抌す人は誰もいたせんか
try構文は単玔で、定型コヌドを枛らすための矎しい方法ですが、なぜgopherがサディズムを愛しおいるのかわかりたせん。

ブロックが1行にずどたる堎合、1぀のステヌトメントが衚瀺されるようにgofmtが倉曎された堎合はどうなりたすか

そうすれば、ラップされた゚ラヌを凊理するのに、ほずんどの堎合3行ではなく1行しかかからない可胜性がありたす。 これにより、゚ラヌ凊理によっお占められる垂盎方向のスペヌスが削枛され、゚ラヌ凊理が平均的な関数の垂盎方向のスペヌスの半分以䞊を占めおいないように芋えたす。

これがどのように芋えるかです

// we already have an err in scope
err = frub.Confozzle(foo, bar, baz)
if err != nil { return errors.Wrap(err, "confozzling didn't work") }

おそらく、Goコミュニティでぱラヌコンテキストが少し独断的になっおいるず思いたす。 私は個人的にこれに陥り、゚ラヌを過床に文脈化しお、非垞に長く、反埩的で、読みにくいメッセヌゞをもたらしたこずを知っおいたす。 ゚ラヌをコンテキスト化するタむミングずしないタむミングに関しおは、倚くのニュアンスがありたす。

゚ラヌラッピングずスタックフレヌム/゚ラヌ印刷のものは、はるかに簡単になりたす。 そのうちに良い解決策があるず思いたすが、今はそうではありたせん。個人的には、パラメトリック倚型が解決するたで、より匷力なgo2機胜の導入を埅ちたいず思いたす。これは、残りの機胜を蚭蚈するずきに圹立぀可胜性があるためです。

そのたたにしおおくこずに完党に同意したす。 少し冗長すぎたすが、埓うのはかなり簡単です。

枛らすこずができれば

if err := foo.x(a, b); err != nil {
    return err
}

if err := foo.y(); err != nil {
    return err
}

if err := foo.z(c); err != nil {
    return err
}

のようなものに

if err := check foo.x(a, b), foo.y(), foo.z(c); err != nil {
    return err
}

むディオムをあたり倉えなくおもいいかもしれたせん。

@henvicそれに関する問題は、3぀の゚ラヌを同じ方法で凊理したいず想定しおいるこずだず思いたす。 Goを䜿甚するず、各゚ラヌを個別に凊理する方法を考える必芁がありたす。 個別の゚ラヌチェックがあるず、これが明確になりたす。 それらを1぀に集玄するず、開発者は認知的に戻っお確認する必芁がありたす。これらの゚ラヌは_本圓に_同じように凊理する必芁がありたすか この提案では、明確さが倱われ、キヌストロヌクが数回少なくなるず゚ラヌに぀いお考える必芁が生じたず思いたす。

@sanbornm 、あなたは正しいです。 同意したす。

このcheckは、1぀の戻り匕数のみを取り、最初のれロ以倖の倀nullなどで返すcheckNonZero挔算子である可胜性もありたす。 しかし、曖昧すぎお、蚀語にさらに圱響を䞎えるこずに加えお。 たずえば、io.EOFを期埅しおいる堎合は、䜿甚すべきではないずいうヒントが少しでも䞎えられたす。 別の可胜性は、おそらく、少なくずも最も䞀般的なケヌスパむプから読み取るずきのio.EOFなどを知らせるためにgo vetを頌りにするこずです...しかし、このアむデアは埗意ではありたせんすべお私に。

try提案に問題はありたせんか
叀い動䜜を䜿甚したい堎合、たたは他の方法で゚ラヌを凊理する必芁がある堎合は、叀い方法を再利甚しおみたせんか try構文を䜿甚しおいる銖を抌す人は誰もいたせんか
try構文は単玔で、定型コヌドを枛らすための矎しい方法ですが、なぜgopherがサディズムを愛しおいるのかわかりたせん。

私たちは皆、コミュニティに䜏んでいたす。 私は毎日、他の人が曞いたたくさんのコヌドを扱っおいたす。 ですから、蚀語を倉えおも、䜿わなくおも圱響を受けたす。

倧芏暡なプロゞェクトでは、最悪のログは、誰かが曞いたこずを忘れた関数によっお生成されたす。この関数は、「ポケモン」䟋倖ハンドラヌが実行するたで䜕もキャッチされなかった汎甚new Exception()をスロヌしたラむブラリを呌び出すラむブラリを呌び出すラむブラリを呌び出したす。䞀般的な゚ラヌをログに蚘録したした。 2番目に悪いものは同じですが、䞍可解な数癟行のスタックトレヌスがあり、最終的に原因を突き止めるこずができるず思いたす幞い、 github.com/<us>/<ourproject>を怜玢するだけで、関連情報のほずんどが芋぀かりたすが、時々たくさんありたす。 その名前にもかかわらず、「䟋倖」は倧きなJavaプロゞェクトでは悲惚なほど䟋倖的ではありたせん。

䞀方、冗長なコンテキストがたくさんある堎合でも、重芁なコンテキストをどこかに埋め蟌むこずに熱心に取り組んでいる限り、 "narf: Error unpoiting the zort: foo: Unexpected bar in baz: {\"ork\": \"morpork\"}"ような単玔なGo゚ラヌ文字列は私の経隓では通垞は非垞に簡単に解釈できたす。実際の゚ラヌ倀。 重芁なコンテキストが欠萜しおいるこずが刀明した堎合、それは通垞かなり明癜です。 このような堎合の「修正」は、コンテキストを远加しお別の゚ラヌを埅機するこずであるため、完党ではありたせんが、バランスをずるず、スタックトレヌスをスクロヌルしたり、䟝存関係の䟝存関係に䟝存しお「スロヌ」するよりも、これを優先したす。 「たたは「発生」する正垞な゚ラヌメッセヌゞ。 panic()ずいう名前が、ほずんどのGo開発者が本質的に同じ蚀語機胜を自由に展開するこずを劚げおいるように芋えるこずを本圓に感謝しおいたす。 結局、 errorずpanic同じものにしないようにしたしょう。

関数に12ほどの障害モヌドがあり、それらの倧郚分が同じ゚ラヌメッセヌゞに倀する状況に遭遇するこずがありたす。 繰り返しは実際には気になりたせんが、通垞、私のチヌムには他の誰かが気になりたす。そのため、これらの䞀般的な゚ラヌを凊理するために、関数の開始時にクロヌゞャを宣蚀するこずで劥協したす。

func foo(a, b, c SomeArgType) (x, y, z SomeReturnType, err error) {
  handleError := func(handleErr error) (x, y, z SomeReturnType, err error) {
    log.WithFields(logrus.Fields{
      "package": "foo",
      "func": "foo",
      "arguments": map[string]SomeArgType{"a": a, "b": b, "c": c},
      "error": handleErr,
    }).Error("Error fooing the bar")
    return reasonable, default, values, handleErr
  }

  err := doABunchOfThings()
  if err != nil {
    return handleError(err)
  }
}

確かに、これはいく぀かの点でただ䞍完党な解決策です。 しかし、これを行うこずで、将来の開発者が、制埡フロヌがあたり飛び回るこずなく、 fooがい぀䜕を返すかを非垞に簡単に理解できるようになったこずが気に入っおいたす。

どういうわけか、この繰り返しの「問題」が、私が通垞芋おいるように還元䞍可胜な耇雑なパッケヌゞ内の少数の還元䞍可胜な耇雑な関数に限定されるのではなく、倚数のパッケヌゞ党䜓で非垞に䞀般的である堎合、プロゞェクト党䜓の「ファンクタヌ」を䜿甚しお同様の目的であり、ため息パラメトリック型の抂念が蚀語に远加された堎合、try / catchに䟝存するこずなく、゚ラヌ凊理ファクトリファクトリの背埌にさらに詳现を隠すこずができたす。

@thomasf

゚ラヌラッピングずスタックフレヌム/゚ラヌ印刷のものははるかに簡単になりたす

同意したす。

個人的には、パラメトリック倚型が解決するたで、より匷力なgo2機胜の導入を埅ちたいず思いたす。これは、残りの機胜を蚭蚈するずきに圹立぀可胜性があるためです。

元のtry提案の䜕人かの人々は、ゞェネリックを埅぀こずに぀いおも議論したしたが、パラメトリック倚型がtry提案をどのように倉えるかは私にはわかりたせん。 すでに組み蟌たれおいるので、蚀語で衚珟できるものの制限に限定されたせん。

@icholy

より合理化された゚ラヌ凊理を芁求する圧倒的なコミュニティフィヌドバックがありたした幎次調査から。 Goチヌムは珟圚その問題に取り組んでいたす。

これに察応するためだけに。 英囜のEU離脱を支持する過半数もありたした。 確かに、EUは䞀般倧衆が察応したいく぀かの䞍利な点ももたらしたす。 しかし、すべおの遞択肢が提瀺された埌は、EUにずどたるのは結局それほど悪くはないように思われたした。

さお、これを政治化するこずは私の意図ではたったくなく、あなたは䞊蚘に同意しないかもしれたせん。 しかし、私が瀺したいのは、倧倚数が最初に䜕かを迷惑だず考えたずしおも、すべおの遞択肢を怜蚎した埌でも、それが最善の解決策になる可胜性があるずいうこずです。

私ぱラヌ凊理に぀いお匷く意芋を持っおいたせんが、それは物事をそのたたにしおおくための議論になる可胜性がありたす。

プロフェッショナルなコヌディング環境では、珟圚の゚ラヌ凊理手法を利甚しお、トレヌスシステムに泚釈を付け、ログを装食したす。 䜙談ですが、暗黙的な戻りは、゚クスポヌトされたラむブラリ関数でパニックを䜿甚するのず䌌おおり、フロヌ制埡の即時の可読性を芆い隠したす。

@icholy

より合理化された゚ラヌ凊理を芁求する圧倒的なコミュニティフィヌドバックがありたした幎次調査から。 Goチヌムは珟圚その問題に取り組んでいたす。

これに察応するためだけに。 英囜のEU離脱を支持する過半数もありたした。 確かに、EUは䞀般倧衆が察応したいく぀かの䞍利な点ももたらしたす。 しかし、すべおの遞択肢が提瀺された埌は、EUにずどたるのは結局それほど悪くはないように思われたした。

この人の䞻匵を真剣に考える必芁はありたせん。絵文字の数は、人々が䞀般的にtry提案を嫌い、䞀般的にこの「そのたた」の提案を奜むこずを瀺しおいたす。

私の実践では、PSはメむンドメむンネットワヌクサヌビス、CLIナヌティリティでGoを嫌う倧倚数の人々がそれを䜿甚したこずさえありたせん。 だから私は圌らの意芋を無芖したいず思いたす。

try提案よりも優れた、物議を醞すこずが少ないオプションが必芁です。
急いで解決する緊急性は芋圓たらない。

@velovixトラむ/キャッチ゚ラヌの「凊理」よりもパラメトリックポリモヌフィズムが嫌いだず思いたすが、それが蚀語機胜になった堎合、別の組み蟌み蚀語機胜の必芁性を回避するいく぀かの方法を芋るこずができたした。

䞀぀には、人々が繰り返したくないコヌドは、次のような定型文です。

foo, err := Foo()
if err != nil {
  log(err)
}
bar, err := Bar(foo)
if err != nil {
  log(err)
}
// ...

次に、パラメトリック関数、型掚論、および_maybe_たたは_optional_スタむルのオブゞェクトデザむンパタヌンのいく぀かの組み合わせは、奇劙な非線圢制埡フロヌ戊略に頌るこずなく、ボむラヌプレヌトを簡単にheh削枛したす。

func<T> DoWithErrorLogging(f func(any...) (T, error), args... any) T {
  t, err := f(args...)
  if err != nil {
    log(err)
  }
  return t
}
// ...
foo := DoWithErrorLogging(Foo)
bar := DoWithErrorLogging(Bar, foo)

IMOこれはすべお、Go1よりもはるかに悪いでしょう。 しかし、この_plus_ try / catchキヌワヌドをその蚀語で䜿甚するよりはたしです。

正盎なずころ...今のずころ、Go2の私のお気に入りの「砎壊的な」倉曎は、Go1の小さな䞍䟿をすべお修正するだけだず思いたす。たずえば、 net/httpデフォルトは、可倉共有グロヌバル内にネストされた可倉共有グロヌバルです Hashicorpのcleanhttp暙準基本的に、たたは(*time.Timer).Reset()に、知っおおく必芁のsyscallパッケヌゞ党䜓を䜜成したす。 Go3は、その盎埌に、人々が成長させたい腫瘍が䜕であれ、リリヌスするこずができたす。 倧小の重倧な倉曎をすべお1぀のリリヌスで行う必芁がある理由がわかりたせん。

控えめに䜿甚するず、 tryに賛成です。 人気のあるプロゞェクトでは、tryを䜿甚しおも問題がないかどうかに関するガむドラむンが远加され、小芏暡/新芏/独身のプロゞェクトでは、 tryが原因で、゚ラヌが少なくなり、䜿甚できなくなるこずがあるず思いたす。

蚀語にtryを远加しおも、それほどひどいこずはないず思いたす。 人々の最悪の堎合の恐れが根底にあるこずが蚌明された堎合、その䜿甚は眉をひそめるでしょう。 経隓の浅い人は無差別に䜿甚したすが、他の人は䜿甚したせん。 それは䞖界の終わりではありたせん。

tryが远加された堎合、私はおそらくそれを䜿甚するでしょう。 そのような堎合は、゚ラヌが返されたすが、実際に゚ラヌが発生する可胜性は非垞に䜎いず思いたす。コンテキストを远加しおも意味がわからないので、そのたた゚ラヌを返したす。 たずえば、1 TBであるこずがわかっおいるディスクを埋めるファむルシステムを䜜成したばかりの堎合、1kbのファむルたたはディレクトリを䜜成するためのスペヌスがあるこずを確信できたす。 それが倱敗した堎合、私ぱラヌを無芖したくありたせん-それは他の堎所のバグ、ハヌドりェア障害などを瀺しおいる可胜性がありたす。しかし、すべおのめちゃくちゃ-ありそうもない゚ラヌに泚釈を付けるこずに努力する䟡倀はありたせん。

try..が、入力時に考えるために、コヌダヌのマむンドスタックにもう1組の括匧/ブラケットを配眮する方法が奜きではありたせん。 そしお、私が想像できる最も長い間

したがっお、これはより良いです
倀、゚ラヌ= foo
err= nilの堎合はerrを返したす

しかし、それでもこれは非垞に䞀般的です。 だから私はこのようなsmtがどういうわけか可胜であるかどうかを望みたす

倀、゚ラヌを確認しおください= foo

Goが読みやすい蚀語になりたい堎合は、読みにくい、たたは理解しにくいず考える胜力を最小限に抑える必芁がありたす。

Goが適切な゚ラヌ凊理を行いたい堎合は、゚ラヌがコヌルスタックを䞊るずきに、゚ラヌに远加のコンテキストを持たせるように促す必芁がありたす。 ゚ラヌを凊理するためにdeferを䜿甚するずいう芁件は、玛らわしいようです。 ゚ラヌハンドラに゚ラヌがある堎合はどうなりたすか 延期はスタック順に実行されたすが、ハンドラヌを逆に宣蚀する必芁がありたすか

ステヌトメントが単玔で、ここにあいたいさの䜙地がほずんどない堎合。 tryは、実際の゚ンゞニアリングの問題ではなく、問題を解決しおいるように感じたす。 私はこの提案が奜きです。なぜなら、これらの耇雑な提案のあらゆる偎面を完党に理解するこずなく、サむレントマゞョリティが最終的に発蚀できるからです。

@icholy瀌儀正しくしおください。 Gopherの行動芏範に泚意しおください https 

皆さん䞊蚘の私のコメントhttps://github.com/golang/go/issues/32825#issuecomment-506740412に加えお、https//golang.org/wiki/NoPlusOneに泚意しおください。 「同意する」たたは「同意しない」ず蚀っおも意味がありたせん。 代わりに絵文字ボタンを䜿甚しおください。 ありがずう。

@sanbornm

私はメッセヌゞに返信するこずが可胜であるこずに同意したす。それは厄介で䞍可胜ではないず蚀いたした。そしお、このミニスレッドが他のコメントの猛吹雪で倱われるずいう点で、スレッドに぀いおの私のポむントはただ残っおいたす。

私ぞの提案は、倉化の呌びかけを意味したす。 この特定の問題は反倉化です。 ゚ラヌ凊理を倉曎しない提案を䜜成するこずを提案したすか 提案䜓制は玠晎らしいず思いたすが、珟状は過小評䟡されおいたす。

提案Bを採甚すべきではないず蚀っお提案Aを䜜成する必芁はありたせん。 代わりに提案Bに反察祚を投じおください。 提案Bの詳现に぀いおは、その提案たたはメヌリングリストを䜿甚しおください。

この堎合の提案Bはロックされおいるこずを理解しおいたす。この提案には、1日以内に77のコメントがあるずいう事実が理由を瀺しおいたす。このレベルのディスカッションは、課題远跡システムよりもメヌリングリストでうたく機胜したす。

@ianlancetaylor

私はメッセヌゞに返信するこずが可胜であるこずに同意したす。それは厄介で䞍可胜ではないず蚀いたした。そしお、このミニスレッドが他のコメントの猛吹雪で倱われるずいう点で、スレッドに぀いおの私のポむントはただ残っおいたす。

十分に公平です、それは理にかなっおいたす。 メヌリングリストは玠晎らしいですが、この堎合、個人的にはGitHubを介しお投皿する方が簡単だず思いたす。 珟圚の゚ラヌ凊理が玠晎らしいこず以倖は蚀うこずはあたりありたせんが、それが倉わらないこずを願っおいたす。 絵文字/投祚はこれに最適です。 100人の「投祚」で十分なメヌリングリストに「゚ラヌ凊理をそのたたにしおおいおください」ず100人が曞くこずはおそらく望たしくありたせん。

この問題はロックされおいるため、絵文字で「投祚」するこずはできなくなりたした。 そのため、この問題はそもそも䜜成されたず思いたす。

副次的な点ですが、関連する䟝存関係の管理はうたく凊理されたせんでした。 Depはうたく機胜し、どこからずもなくgo modが遞択されたした芋た目から[1]。 これが提案制床ができた理由だず思いたす。 この堎合の提案システムは、問題がロックされおいお、メヌリングリストに行くように蚀われた堎合、コミュニティを過小評䟡する可胜性があるず感じおいたす。

[1] https://twitter.com/_rsc/status/1022588240501661696

線集Goチヌムずコミュニティは、ほずんどの堎合、コミュニティのフィヌドバックを聞いお玠晎らしい仕事をしおいたす。 私はそれに入るすべおの仕事に感謝したす。 Go調査は良い䟋です。

@sanbornm

Depはうたくいきたした

ここで反察する必芁がありたす。 Goモゞュヌルは、 https //proxy.golang.orgによる氞続的なキャッシュに関する、よく知られおいない「gobindata」の問題を最終的に解決したした

その担圓者は問題に気づかず、代わりにVCSを介しお掟手な「保蚌」をいじっおいたした。

@sirkonこれは少し倖れたトピックですが、Depが行っおいたようにベンダヌのdepが行っおいる堎合は、そのいずれも必芁ありたせん。

珟状では、1行に1぀のtryステヌトメントのように、制玄が远加されない限り、そのたたにしおおくほうがいいず思いたす。 その理由から、この䟋を考えおいるの提案-それは十分に無害ず思われるinfo := try(try(os.Open(file)).Stat())が、それは通垞どのような制埡フロヌの範囲を超えおファむルハンドルをリヌクしたす。 io.Closer実装や、よりコンパクトなコヌドを远求するために人々が回避する可胜性のあるその他のクリヌンアップ関数を䜿甚するず、ファむルリ゜ヌスリヌクが増加するず思いたす。

fがラむブではなくなり、すぐにGCの察象になり、ある時点でファむナラむザヌがfを確実に閉じるため、重芁ではないず考える人もいるかもしれたせん。 これにより、関数ブロックにバむンドされおいる、今日のdeferを䜿甚するずいう以前の明確なリンタヌでサポヌトされおいる芏則が倉曎されるず思いたす。 機胜ブロックが終了するず、リ゜ヌスが解攟されたす。 ガベヌゞコレクタヌに䟝存しおも、リ゜ヌスを䜿い果たしないずいう保蚌はありたせん通垞、開いおいるファむルハンドルの制限のデフォルトは1kから4kの間です。これは、単玔なファむルパスで簡単に超えられたす。

芁玄するず、実装されたこの構文は、ctor / dtorがなく、リ゜ヌスリヌクを防ぐためにコヌドブロックから遠く離れた䜎レベルのGC機構に䟝存しおいるため、Goのリ゜ヌス管理に埮劙なリスクをもたらすず思いたす。 無害ず思われるものを朜圚的な゚ラヌ状態開いおいるファむルが倚すぎるに倉える。

var n int
for _, name in try(os.Readdir(...)) {
   n += try(getSize(name))
}
func getSize(name string) (int, error) {
   return try(try(os.Open(name)).Stat()).Size
}

線集
制玄に぀いおは、 a, b := try(get("a")), try(get("b"))で十分であるため、割り圓おの右偎でのみ有効である堎合は、1行に1぀ず蚀うよりも適切だず思いたす。 ただし、それでもtry(os.Open(name)).Stat()を実行する機胜は残りたす。これは、tryを無効にした堎合に限りたすが、割り圓おのRHSにない堎合にのみ、次のように機胜しないものが残りたす。党お。

@cstocktonすごい玠晎らしい発芋

Rustには実際には同様のマクロ私が正しく芚えおいれば? があり、このtry意図したずおりに動䜜したすが、適切なraiiがあるため、その蚀語では問題はなく、巚倧です私たちの堎合の穎

@sanbornmええ、あなたのリポゞトリにむンタヌネットの半分を保持するこずは確かに玠晎らしいアむデアのように芋えたす。

Finishing Touch

try時間ず劎力を節玄できる堎所の数を数えるナヌティリティに぀いお誰かが蚀及し

| プロゞェクト| LOC * | 候補者を詊す|
| ---------- | ------ | ---------------- |
| cal1 | 2047 | 3 |
| pump1 | 1030 | 0 |
| docs1 | 4576 | 8 |
| hugoutil | 604 | 1 |
| 他のすべお| 8452 | 23 |

  • clocナヌティリティに埓っお、コメントを陀いおコヌドのみを実行したす。

「その他すべお」の内容には、Goを孊んでいたずきに曞いた簡単なハックずコヌドが含たれおいるこずに泚意しおください。

私の党䜓的な結論は、少なくずも私にずっおは、 try提案は、私の゚ラヌ凊理を䟡倀のある皋床たで合理化するのに圹立たないずいうこずです。

私が行くのが倧奜きな最倧の理由は、その仕様がコヌダヌを他の蚀語で利甚可胜な構文の小さなサブセットに制限しおいるこずです。 これは非垞に小さな機胜セットであるため、機胜セット党䜓を簡単に孊ぶこずができたす。 将来の開発者はおそらく私のコヌドを芋お、私が䜕をしたかを知るこずができたす。 蚀語に新しいものが远加されるたびに、将来の開発者がそのこずを知る可胜性が䜎くなりたす。 滑りやすい坂の極端な郚分は、C ++やscalaのように、耇雑さのために理解しにくい蚀語です。
go1に構文が远加されないようにしたいのですが。代わりにgo2に入れおください。

@miekgこのリンクhttps://github.com/golang/go/issues/32825#issuecomment-506882164を提案に远加しおください。 この䟋では、この最近のtryキヌワヌドのアむデア党䜓が完党に倱栌になっおいたす。

image

そのたたにしおおくこずに完党に同意したす。 少し冗長すぎたすが、埓うのはかなり簡単です。

枛らすこずができれば

if err := foo.x(a, b); err != nil {
  return err
}

if err := foo.y(); err != nil {
  return err
}

if err := foo.z(c); err != nil {
  return err
}

のようなものに

if err := check foo.x(a, b), foo.y(), foo.z(c); err != nil {
  return err
}

むディオムをあたり倉えなくおもいいかもしれたせん。

「たぶん」タむプに぀いお話しおいた堎合、最初にバリアントタむプが必芁です。

if err != nilが機胜するようにしたしょう。それは明らかで、それほど冗長ではなく、コヌドの流れの䞭で理にかなっおいたす。 このコンストラクトを䜿甚しおコヌドを読むず、それが䜕をするのかがわかりたす。
それを維持したしょう、 try远加しないでください

コヌドを読むずきは、゚ラヌ凊理の有無にかかわらず、ゞョブを実行しおいる行を明確に読み取れるようにしたす。

同じレベルの3文字の「err」は私には受け入れられたす。 重芁なコヌドは第2レベルにあるためlispを芚えおいたすか、重芁なコヌドをラップする「check」関数は必芁ありたせん。たた、重芁なコヌドがむンデントされるため、前に「try」行を䜿甚したくありたせん。そしお2行目に。

res、err= begin_job
if err= nil {
handle_error
}

err = continue_jobres
if err= nil {
handle_error
}

このコヌドを䜿甚するず、ブロックの最初の行を読み取るこずで、゚ラヌ以倖のケヌスのフロヌを読み取るこずができたすすばやく読む必芁があるずきにドキュメントのタむトルを読むため

try時間ず劎力を節玄できる堎所の数を数えるナヌティリティに぀いお誰かが蚀及し

プロゞェクトLOC *候補者を詊す
cal1 2047 3
pump1 1030 0
docs1 4576 8
hugoutil 604 1
他のすべお845223

  • clocナヌティリティに埓っお、コメントを陀いおコヌドのみを実行したす。

倧芏暡なプログラムではtryがもっず必芁だず思いたす。 メモリから描画するだけで、LOCサむズが玄15〜20k以䞊のプログラムでは、より倚くのプログラムが必芁になるず思いたす。これは、クロヌズドシステムで適切に指定および凊理されるため、゚ラヌを枡す必芁があるレむダヌを取埗し始める可胜性があるためです。送信偎ず受信偎の䞡方。 それはそれがどの皮類のプログラムであるかに倧きく䟝存したす。 私はおそらく小さなプログラムでもあたり詊しおみないでしょう

倧芏暡なプログラムでは、詊しおみる必芁があるず思いたす。

いい芖点ね。 heptio / contour、28.7k行の゜ヌステキストでtryhardを詊したしたが、tryhardは12個の眮換を芋぀けたした。

倧芏暡なプログラムでは、詊しおみる必芁があるず思いたす。

いい芖点ね。 heptio / contour、28.7k行の゜ヌステキストでtryhardを詊したしたが、tryhardは12個の眮換を芋぀けたした。

わお 12察28.7K行、これには本圓に専甚のキヌワヌドが必芁です

たあ、私はこれに関するあなたのPOVにもっず興味がありたす

stat := try(try(os.Open(fileName)).Stat())

プログラムがもう少しモノリシックで、倚くのサヌビス間のサヌビス統合の䞀郚ではない堎合は、より䞀般的だず思いたす。 そのリポゞトリ heptio/contour のgithubでfmt.errorfたたはerrorsを怜玢するず、結果が非​​垞に少ないため、簡単な抂芁を取埗するのは困難です。倧芏暡なプログラムであっおも、プログラムごずに倧きく異なる可胜性があるず述べたした。

倚くの倖郚ラむブラリを䜿甚しない単䞀のプログラムがあるずしたす。 次に、特定のAuthorizationErrorを蚭定できたす返されるすべおの゚ラヌは、すでに凊理およびラップされおいるio゚ラヌで十分に具䜓的であるこずがわかりたす。これには、ナヌザヌメタデヌタが既に含たれおおり、実際に必芁なものに倧きな倉曎を加えるこずなく、いく぀かのレむダヌを倉曎せずに䌝播できたす。リク゚ストレむダヌたでそれらを凊理したす。

プログラムがもう少しモノリシックで、倚くのサヌビス間のサヌビス統合の䞀郚ではない堎合は、より䞀般的だず思いたす。 そのリポゞトリのgithubでfmt.errorfたたはerrorsを怜玢するず、結果が非​​垞に少ないため、簡単な抂芁を取埗するのは困難です。しかし、私が蚀ったように、プログラムによっお倧きく異なる可胜性がありたす。倧芏暡なプログラムであっおも、プログラムする。

倚くの倖郚ラむブラリを䜿甚しない単䞀のプログラムがあるずしたす。 次に、ナヌザヌメタデヌタがすでに含たれおいる特定のAuthorizationErrorを䜜成し、リク゚ストレむダヌたで実際に凊理する必芁のあるものに倧きな倉曎を加えるこずなく、いく぀かのレむダヌを倉曎せずに䌝播できたす。

わからない。 泚釈は、゚ラヌが発生した方法を簡単に芋぀けるためのものです。 同様にos.NotExistが、これぱラヌパスに関する良いヒントにはなりたせん。

@thomasfは、

529628゜ヌス行、tryhardは17630.3の眮換を怜出したした。

ええ、確かに。 あなたは䞡方に関わっおきたので、プログラムを曞くためのさたざたな方法の良い䟋ではないかもしれたせん。 tryhardプログラムatmを詊す時間すらなく、さたざたな゜ヌスで適切に実行する時間がありたせんgithub経由で収集された堎合、クロヌズド゜ヌスコヌドが省略されるため、ずにかく収集できない可胜性がありたす

529628゜ヌス行、tryhardは17630.3の眮換を怜出したした。

誰か芁出兞が賢明に蚀ったように、 tryぱラヌの凊理を容易にしたせん。 それはそれらを扱わないこずをより簡単にしたす。

コヌドを分析しおtry眮換をたくさん芋぀けた堎合、コヌドぱラヌを返す以倖は䜕もしないずいうこずだけがわかりたす。 それはおそらく玠晎らしいコヌドではありたせん。 人々が怠惰になり、゚ラヌを心配しないようにする必芁がありたすか それを正確に回避するために、Goに䟋倖がない理由の1぀ではありたせんか

私はその立堎を取る぀もりはありたせん。 しかし、私が芋぀けおいるのは、それを瀺唆する圌らの小さな裏付けずなる蚌拠です

NS。 tryが既存のgoコヌドベヌスに適甚できる堎所はたくさんありたす
NS。 䞀般に、゚ラヌ凊理はSLOCの重芁な郚分を構成したす。これは、私自身の枬定倀ずGoチヌムによっお決定された数倀に基づいおいたす。参照

コヌドを分析しおtry眮換がたくさん芋぀かった堎合、コヌドぱラヌを返す以倖は䜕もしないずいうこずだけを瀺しおいたす。 それはおそらく玠晎らしいコヌドではありたせん。 人々が怠惰になり、゚ラヌを心配しないようにする必芁がありたすか それを正確に回避するために、Goに䟋倖がない理由の1぀ではありたせんか

  1. あなたは、良い習慣ではないこずに぀いお䜕も知らない理論的コヌドに぀いお䟡倀刀断を䞋しおいたす。
  2. tryが珟圚よりも誀甚されやすいかどうかはわかりたせん。goにぱラヌ凊理を匷制する機胜がなく、すでにスキップするのは非垞に簡単です。 私にずっおはtryそれが゚ラヌを凊理する必芁がない堎合は読みやすいコヌドを䜜りに぀いおです。

tryは倚くの堎所で必芁ずされないため、必芁ないかもしれたせんが、単に䞍機嫌になるのではなく、アむデアを楜したせおナヌスケヌスを考えおみたしょう...

自分でどうやっお䜿うのか、自分ではあたり考えられたせんが、ただ存圚しおいないので、もしあったら違うデザむンにするかどうかはわかりたせん。 doは、tryを䜿甚しおこのような無名関数にいく぀かのアクションをグルヌプ化し、呌び出し元に返す前に゚ラヌを凊理したす。 これにより、䞀郚のコヌドがはるかに読みやすくなる可胜性がありたす。

var v1, v3 string
if err := func() error {
    try(onething())
    v = try(twothing())
    try(otherthing())
    v3 = try(somethingg())
}(); err != nil {
  ... handle error...
}

この時点で、さたざたなパッケヌゞのtryhardデヌタを保持し、それらを芖芚化するWebサむトを䜜成するこずをお勧めしたす。 たぶん、golang / gddogodoc.orgを少し倉曎するだけでうたくいくでしょう。

私はif err != nil攟っおおくほうが奜きです。 ただし、゚ラヌ凊理のために䜕かを远加する必芁がある堎合は、 throwsキヌワヌドを远加する新しい提案がありたす。

32852

ここですでに説明した議論のいく぀かを繰り返さずに、私はif err != nilをそのたたにしおおくずいう感情を゚コヌし​​たす。

私が提䟛できる芖点は次のずおりです。䜕癟人もの新参者プログラミングず他の蚀語からのGoの䞡方にGoを教えた人ずしお、 if err != nilは圌らにずっお決しお問題ではありたせんでした。 私のワヌクショップの経隓豊富なプログラマヌは、最初は珍しいこずに気づきたすが、すぐにGoでの゚ラヌ凊理の明瀺的な性質を愛するようになりたす。

蚀語で察凊できるより倧きな懞念があり、この問題に察するコミュニティの明確な反応は、 if err != nilはそれらの1぀ではないず蚀っおいたす。

Goは倚くの理由で完璧です。 その䞭で最も重芁なのは「iferr= nil」です。 冗長に芋えるかもしれたせんが、コヌディングを孊ぶ人々にずっおは、コヌドのデバッグずコヌドの修正が容易になりたす。

@davecheney

私はその立堎を取る぀もりはありたせん。 しかし、私が芋぀けおいるのは、それを瀺唆する圌らの小さな裏付けずなる蚌拠です

NS。 tryが既存のgoコヌドベヌスに適甚できる堎所はたくさんありたす
NS。 䞀般に、゚ラヌ凊理はSLOCの重芁な郚分を構成したす。これは、私自身の枬定倀ずGoチヌムによっお決定された数倀に基づいおいたす。参照

珟圚の状況では、私たちが芋぀けた䟋は「たあ、それはおそらく良いコヌドではない」ずしお华䞋されるのではないかず心配しおいたす。

次に䟋を瀺したす。

llorllale:~/go/src/github.com/hyperledger/fabric$ cloc --exclude-dir=vendor .
    2406 text files.
    2256 unique files.                                          
    3130 files ignored.

http://cloc.sourceforge.net v 1.60  T=6.69 s (272.8 files/s, 58350.9 lines/s)
--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
Go                             1751          54365          34149         294005
YAML                             35            547           2171           2060
Bourne Shell                     26            354            325           1312
make                              3            135             96            418
CSS                               1             40             14            140
HTML                              3              7              5             63
Python                            1             50            103             57
Bourne Again Shell                1              1              6             50
Java                              3              7              4             26
XML                               2              1              4              2
--------------------------------------------------------------------------------
SUM:                           1826          55507          36877         298133
--------------------------------------------------------------------------------
llorllale:~/go/src/github.com/hyperledger/fabric$ tryhard -l . | grep -v vendor | less | wc -l
1417

公平を期すために、tryhardが芋぀けた堎所の数に関するデヌタは、ラッピング゚ラヌを必芁ずする芏則によっお混乱する可胜性がありたす。 たずえば、あなたの䌚瀟の慣習が

if err != nil {
   return errors.Wrap(err) 
} 

...
if err != nil {
   return errgo.Notef(err, "error doing x") 
} 

それはtryhardによっお報告されないでしょう。

私の䌚瀟ではそのような倧䌚がありたす。 単玔な怜玢ず眮換を実行しおそれらをネむキッド゚ラヌリタヌンに戻すず、次の結果が埗られたす。

Language                             files          blank        comment           code
---------------------------------------------------------------------------------------
Go                                    2488          40317          15901         297038

tryhardは2736の眮換を報告しおいたすが、残りのラッピングを手動で確認するず、玄1850が過小評䟡されおいるように芋えるため、コヌドベヌスの30䞇行で合蚈玄4500 try䜿甚量を芋積もっおいたす。

個人的には、゚ラヌ凊理の珟圚の明瀺性に賛成であり、気にしたせん。

たずえば、あなたの䌚瀟の慣習が
[゚ラヌをカスタムメッセヌゞでラップする]
それはtryhardによっお報告されないでしょう。

それがポむントです— tryプロポヌザルはif err != nil return errネむキッドリタヌンを単玔化するだけで、カスタムメッセヌゞずコンテキストによる゚ラヌのラッピングをサポヌトしおいたせん。

if err != nilの唯䞀の反埩性は、他の戻り倀のれロ倀も指定する必芁があるので修正できるず思いたす。 蚀語を曎新しお、それを排陀するこずができたす。 䟋えば

今日のGoで、このシグネチャを持぀関数がある堎合

func add(x, y string) (int, error)

関数のどこかに、次のように曞く必芁がありたす。

func add(x, y string) (int, error) {
    // ...
    if err != nil {
        return 0, err
    }

関数党䜓で同じれロ倀を繰り返すようにラむタヌに匷制したす。

蚀語が゚ラヌ以倖の戻り倀のれロ倀を自動的に入力できれば、はるかに簡単になりたすそしお、゚ラヌの冗長性ず可読性にほずんどコストがかかりたせん。

func add(x, y string) (int, error) {
    // ...
    if err != nil {
        return ..., err
    }
    // ...
}
func main() {
    add("8", "beep") // returns 0, error(`strconv.ParseInt: parsing "beep": invalid syntax`)
}

DBク゚リや呌び出しず盞互䜜甚する倚くのコヌドの経隓から、関数党䜓でれロ倀を繰り返さなければならないこずが、Goスタむルの゚ラヌ凊理の唯䞀の欠点であるず蚀えたす。 そうでなければ、私はこの提案の感情に同意したす if err != nil攟っおおいおください

泚はい、名前付きの戻り倀はこれを_゜ヌト_達成できたすhttps://play.golang.org/p/MLV8Y52HUBYが、この手法を䜿甚しお自分のコヌドベヌスにいく぀かの関数を実装した埌、私はどれだけの足がかかるかを思い出したした-銃の名前付き戻り倀は次のずおりです。 私はい぀も名前付きの戻り倀をシャドりむングするこずになりたす。

たずえば、あなたの䌚瀟の慣習が
[゚ラヌをカスタムメッセヌゞでラップする]
それはtryhardによっお報告されないでしょう。

それがポむントです— tryプロポヌザルはif err != nil return errネむキッドリタヌンを単玔化するだけで、カスタムメッセヌゞずコンテキストによる゚ラヌのラッピングをサポヌトしおいたせん。

それは本圓です、私は説明的な文字列を远加するこずを可胜にするバリアントを考えおいたした。 ゚ラヌリタヌンの倧郚分〜4000 / 4500は、コンテキストなしのerrgo.Mask(err)であり、説明なしのtry()ず同等であるず考えおいたしたが、珟圚はerrgoはスタック情報を远加し、tryはただ远加しないため、機胜。

@ianlancetaylorここに提案がありたす。 @miekgは、私たちの蚀語のリヌダヌの1人ずしお、if err != nilを眮き換えるこずをもはや远求しないこずを提案しおいたす。 個人的には、他の提案のように扱うのではなく、 golang-nutsに移動しお、この質問の重芁性を䞻匵しようずしおいるように感じたす。 それはあなたの意図ではないかもしれたせんが、それは私が感じる圱響です。

私たちの゚ラヌ凊理方法は独特であり、他の蚀語よりも倧きな付加䟡倀があるず思いたす。 それは私が構築するシステムの゚ラヌに぀いおの私の考え方を完党に倉え、その結果、私はより匷力な゜フトりェア゚ンゞニアになりたした。 より倚くのGo開発者を獲埗するために、倧声で少数掟や郚倖者に詮玢したくありたせん。 コヌドの簡朔さをトレヌドオフするこずで究極的にはより良くなるので、゚ラヌの凊理方法を遞択する方法はその1぀であるため、特定の事柄に぀いおは厳しい方針を取る必芁があるず思いたす。

これは、Google内のチヌムがコミュニティずの信頌ず信頌を築く、たたは蚀語、゚コシステム、たたはそのナヌザヌにずっお良くない珟圚の軌道を継続する機䌚です。

Goチヌムは、この提案をそのたた受け入れる䞀方で、より明確な付加䟡倀を持぀他の無関係な蚀語の反埩を匕き続き远求するようお願いしたす。

トラッカヌにはスレッドがない可胜性がありたすが、個人的には、この提案が公匏の立堎で応答され、静かに曖昧になる可胜性のあるGoogleグルヌプに远いやられないこずを保蚌したいず思いたす。

このトピックはすでにGoogleグルヌプでも議論されおいたす。

32437の珟圚のバヌゞョンは満足のいくものではありたせん。 tryビルトむンは、蚓緎されおいない目に倚くの実行パスを隠したす。 チェックずハンドルを䜿った元の提案は非垞に理解しやすく、checkキヌワヌドが際立っおいたした。

珟圚、組み蟌みのtryは関数のように芋えたす。これにより、制埡フロヌを倉曎できるかどうかは明らかではありたせん。 panicもありたすが、私は信じおいたすが垞に独自のラむン䞊にあり、目立぀名前があり、その䜿甚はほずんどありたせん。 䞀方、tryは、耇雑な匏の䞭に隠れるこずがありたす。

@theckman Robertは、Go with RobずKenの最初のむテレヌションを蚭蚈し、RobertずRussは早い段階でチヌムに参加したした。 圌らは最初からGoに取り組んできたした。 提案が「元のGo䜜成者によっお決定された゚ラヌ凊理の粟神ず矛盟する」かどうかを知るこずは圌らに信頌できるず思いたす。

今日のように゚ラヌ凊理を凍結するずいう提案の原則は嫌いです。 そのような提案は、このトピックに関する将来のすべおの提案を犁止したす。

代わりに、デザむンの反埩を受け入れるだけではどうでしょうか。 チェック/ハンドルの提案がありたした。 しかし、いく぀かの欠点が議論されたした。 これが詊甚提案に぀ながりたした。 この提案のいく぀かの欠点に぀いお、ここで説明したす。 おそらくこれは、正しいアプロヌチが芋぀かるたで、別のより良い提案に぀ながるでしょう。

私たちの゚ラヌ凊理方法はナニヌクです

Rustでの゚ラヌ凊理は、抂念的にはGoで行うものず䌌おいたす゚ラヌは倀であり、明瀺的な制埡フロヌですが、代わりに合蚈型を䜿甚する堎合は耇数の戻り倀を䜿甚したす。 Rustには、Goず同じ問題があり、詳现な゚ラヌ凊理が行われたした。 これにより、Rustは詊しおみたした マクロ、そしお最終的には オペレヌタヌ。 Rustコミュニティは、゚ラヌ凊理に関しおGoコミュニティよりもさらに厳栌だず思いたす゚ラヌ凊理のRFCず議論は啓発的です。 圌らは、悪い゚ラヌ凊理の滑りやすい坂を䜿わずに、゚ラヌ凊理の冗長性を枛らす方法を芋぀けたした。 私たちもできるず確信しおいたす。

蚀語、゚コシステム、たたはそのナヌザヌにずっお良くない珟圚の軌道

あなたは䜕に぀いお話しおいたすか Goは垞に改善されおいたす。 このような玠晎らしい蚀語、ツヌル、ドキュメントに無料でアクセスできるのは玠晎らしいこずです蚀論の自由のように。

@theckman Robertは、Go with RobずKenの最初のむテレヌションを蚭蚈し、RobertずRussは早い段階でチヌムに参加したした。 圌らは最初からGoに取り組んできたした。 提案が「元のGo䜜成者によっお決定された゚ラヌ凊理の粟神ず矛盟する」かどうかを知るこずは圌らに信頌できるず思いたす。

今日のように゚ラヌ凊理を凍結するずいう提案の原則は嫌いです。 そのような提案は、このトピックに関する将来のすべおの提案を犁止したす。

代わりに、デザむンの反埩を受け入れるだけではどうでしょうか。 チェック/ハンドルの提案がありたした。 しかし、いく぀かの欠点が議論されたした。 これが詊甚提案に぀ながりたした。 この提案のいく぀かの欠点に぀いお、ここで説明したす。 おそらくこれは、正しいアプロヌチが芋぀かるたで、別のより良い提案に぀ながるでしょう。

私たちの゚ラヌ凊理方法はナニヌクです

Rustでの゚ラヌ凊理は、抂念的にはGoで行うものず䌌おいたす゚ラヌは倀であり、明瀺的な制埡フロヌですが、代わりに合蚈型を䜿甚する堎合は耇数の戻り倀を䜿甚したす。 Rustには、Goず同じ問題があり、詳现な゚ラヌ凊理が行われたした。 これにより、Rustは詊しおみたした マクロ、そしお最終的には オペレヌタヌ。 Rustコミュニティは、゚ラヌ凊理に関しおGoコミュニティよりもさらに厳栌だず思いたす゚ラヌ凊理のRFCず議論は啓発的です。 圌らは、悪い゚ラヌ凊理の滑りやすい坂を䜿わずに、゚ラヌ凊理の冗長性を枛らす方法を芋぀けたした。 私たちもできるず確信しおいたす。

蚀語、゚コシステム、たたはそのナヌザヌにずっお良くない珟圚の軌道

あなたは䜕に぀いお話しおいたすか Goは垞に改善されおいたす。 このような玠晎らしい蚀語、ツヌル、ドキュメントに無料でアクセスできるのは玠晎らしいこずです蚀論の自由のように。

Rustの開発の歎史は、その背埌にいる人物が圌らが䜕をしおいるのか芋圓が぀かなかったこずを瀺しおいたす。 圌らは基本的にHaskellから゚ラヌ凊理の原則をコピヌしたしたが、これらは呜什型珟実䞖界のプログラミングには適しおいたせん。 それらの?マクロは、最初に倱敗した゚ラヌ凊理システムの単なる回避策です。

@ianlancetaylorここに提案がありたす。 @miekgは、私たちの蚀語のリヌダヌの1人ずしお、if err != nilを眮き換えるこずをもはや远求しないこずを提案しおいたす。 個人的には、他の提案のように扱うのではなく、 golang-nutsに移動しお、この質問の重芁性を䞻匵しようずしおいるように感じたす。 それはあなたの意図ではないかもしれたせんが、それは私が感じる圱響です。

私たちの゚ラヌ凊理方法は独特であり、他の蚀語よりも倧きな付加䟡倀があるず思いたす。 それは私が構築するシステムの゚ラヌに぀いおの私の考え方を完党に倉え、その結果、私はより匷力な゜フトりェア゚ンゞニアになりたした。 より倚くのGo開発者を獲埗するために、倧声で少数掟や郚倖者に詮玢したくありたせん。 コヌドの簡朔さをトレヌドオフするこずで究極的にはより良くなるので、゚ラヌの凊理方法を遞択する方法はその1぀であるため、特定の事柄に぀いおは厳しい方針を取る必芁があるず思いたす。

これは、Google内のチヌムがコミュニティずの信頌ず信頌を築く、たたは蚀語、゚コシステム、たたはそのナヌザヌにずっお良くない珟圚の軌道を継続する機䌚です。

Goチヌムは、この提案をそのたた受け入れる䞀方で、より明確な付加䟡倀を持぀他の無関係な蚀語の反埩を匕き続き远求するようお願いしたす。

圌らは60幎代からの珟圚の型システムでは深刻なこずは䜕もできたせん。 圌らは最終的にGo2.0で80幎代のアむデアを借りる必芁がありたす

あなたは䜕に぀いお話しおいたすか Goは垞に改善されおいたす。 このような玠晎らしい蚀語、ツヌル、ドキュメントに無料でアクセスできるのは玠晎らしいこずです蚀論の自由のように。

@ngrillyその最埌の郚分は、おそらくより倧きな議論のためのものです。 この提案を狂わせるこずなく、そのコメントにいくらかの閉鎖を加えるこずで、ナヌザヌずコミュニティ/゚コシステムのリヌダヌシップずの間の䞍敎合の感情が高たっおいたす。

残りの議論では、構文に認知的オヌバヌヘッドを远加するこずは勝利ではないず思いたす。 圌らが圌らのために働く䜕かを芋぀けおくれおうれしいです、私たちは圌らではありたせん。

むンラむンifステヌトメントの提案を開きたした https 

参照 https 

誰もが自分の奜きな新しいgolang2.0機胜に぀いお提案を提出するず、 https//github.com/golang/go およびその他の機胜のフォヌクのブランチも提䟛され、この䞖界はどれほど玠晎らしいものになるでしょう。その提案を実装するリポゞトリが必芁です。

同意したせんか

@ av86743この提案の範囲を超えおいるようです。 その行動方針を提案する提案を提出しおください。

誰かが提案曞自䜓の䜕かに基づいおそれを断る前に倚くの無駄な努力のリスクのような、私はそれにいく぀かの挑戊を芋たす。 それからあなたはその間ずっずレビュヌさえされないフォヌクに費やしたした。

この構文はどうですか

# call error handler
try callFunction(), errorHandler()

# error handler with anonymous function
variable := try callSomething(), func(err *Error) { # error handling }

@theckmanこの議論を他の堎所に移すずいう私の提案が、それが重芁でないず思われる堎合は、お詫び申し䞊げたす。 私は私の芁求で私の理由を説明したした、そしお私は圌らがただ立っおいるず信じおいたす。 Goチヌムは、提案だけでなくメヌリングリストのディスカッションも怜蚎したす。

「オリゞナルのGo䜜者」ずおっしゃっおいたすが、「try」の提案は、3人のオリゞナルのGo䜜者の1人である

私はこの提案に匷く同意したす。倉曎する必芁があるのは、go fmtだけで、1行のifステヌトメントを蚱可するようにgofmtを䜜成するこずだけだず思いたす。

私は本圓に䞀行欲しい

if err != nil { return wrappedErr{err} }

3行の代わりに

if err != nil {
    return wrappedErr{err}
}

@ av86743この提案の範囲を超えおいるようです。 その行動方針を提案する提案を提出しおください。

@theckmanあなたは私に䜕をすべきかを蚀っおいたす、そしおこれは䞁寧であるだけでなく、倖芋的に倱瀌です。 あなたは自分の奜きなように自分の䜍眮を決めるこずができたすが、私自身も、おそらくここにいる他の誰も、あなたがそう蚀うずきにゞャンプするあなたの「フェッチに行く」猿ではありたせん。

誰かが提案曞自䜓の䜕かに基づいおそれを断る前に倚くの無駄な努力のリスクのような、私はそれにいく぀かの挑戊を芋たす。 それからあなたはその間ずっずレビュヌさえされないフォヌクに費やしたした。

それは[..._簡朔にするために省略された完党に適切な蚀語での説明_...]の「無駄な努力」にすぎたせん。

ただし、コヌダヌにずっおは、それは些现なこずですが、䟿利な挔習であるず同時に、Goコミュニティぞのサヌビスでもありたす。

@ av86743あなたが提案したこずは興味深いアむデアだず思いたす。そしお、関係のない問題のコメントずしおそれが倱われるこずを望んでいたせんでした。 公的な怜蚎の立堎でそれを远求するこずに興味がない堎合は、別の問題を提起するこずを提唱しお申し蚳ありたせん。

この特定の提案は@griesemerからのものGoでのラップされおいない゚ラヌリタヌンの冗長性に぀いお、圌が10幎間内なる怒りに沞隰しおいるずは信じられたせん。 ただし、圌は優れた゚ンゞニアであり、゚ンゞニアは認識された問題の解決策を考え出したす。 それらを止めるのは非垞に難しいです。 私たちは問題を解決するのが奜きです。 問題を嗅ぐだけで、あらゆる皮類のアむデアを思い぀くこずができたす。 その思考プロセスがかなり進んだら、私たちの誰もが私たちの掚定䞊の解決策を感情的に手攟し、_おそらくそれは結局のずころ実際には問題ではない_ず考えるのは難しいです。 結局のずころ、私たちは知的に蚀えば赀ちゃんを産んだので、それを捚おるのは簡単ではありたせん。

私の個人的な疑いは、これに関するGoチヌムの掚論プロセスが次のようになったこずです。

  1. Goは非垞に人気があり、広く䜿甚されおいるため、圓然のこずながら、䜕千人もの人々がGoに぀いおコメント、提案、苊情を持っおいたす。
  2. あなたはずおも長い間しか石垣を䜜るこずができたせん。 Goチヌムは、コミュニティからのすべおの隒音に぀いお_䜕か_をするずいう倧きなプレッシャヌにさらされおいるず感じおいたす。
  3. これは䜕かです。

tryがrecoverのような゚ラヌを芋぀けた堎合にキャッチするために、deferにcatch関数を远加するのはどうですか。
䟋

func doSomthing()(err error){
    //return error
}

func main(){
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

    try doSomthing()
}

倚くの機胜で

func Foo() (err error) {
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

   try{
    file1 := open("file1")
    defer file1.Close()
    file2 := open("file2")
    defer file2.Close()
   }
   //without try
    file3,err := open("file3")
    defer file3.Close()
 }

tryがrecoverのような゚ラヌを芋぀けた堎合にキャッチするために、deferにcatch関数を远加するのはどうですか。
䟋

func doSomthing()(err error){
    //return error
}

func main(){
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

    try doSomthing()
}

倚くの機胜で

func Foo() (err error) {
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

   try{
  file1 := open("file1")
  defer file1.Close()
  file2 := open("file2")
  defer file2.Close()
   }
   //without try
    file3,err := open("file3")
    defer file3.Close()
 }

これは、各゚ラヌを個別の方法で凊理するのにどのように圹立ちたすか

いく぀かの説明

  1. try提案は、このスレッドで䞻匵しおいるこずずは反察に、新しい構文も新しいキヌワヌドも導入しおいたせん。 これは、新しい機胜を远加するために実行できる可胜性のある最小限の倉曎に぀いお、新しい組み蟌みを導入するだけです。 それが重芁なので、これを議論するずきは正確に蚀っおください。 新しい構文ず新しいキヌワヌドの远加ず、組み蟌みの远加には倧きな違いがありたす。 前者は倧きな倉曎であり、埌者は比范的小さな远加です。 try提案が瀺唆しおいるのは、比范的マむナヌな远加です。

  2. @ianlancetaylorは、この議論が他の堎所golang-nutsで行われる方がよいこずに同意したす。 ここに提案はありたせん。

  3. 確かに、 @ bitfield 、 「 Goでのラップされおいない゚ラヌリタヌンの冗長性に぀いおの内なる怒り」はありたせん。ありがずうございたす:-)しかし、゚ラヌチェックはおそらく必芁以䞊に冗長だず思いたす。 そしお、この同じ感情がコミュニティによっお繰り返し提起されおきたずいう事実は、私たちGoチヌムがこの信念を持っおいるだけではないこずを明確に瀺しおいたす。 私は「䜕か」をするために倚くのプレッシャヌがあるずたでは蚀いたせん-私たちはこれに長い間取り組んできたした、そしお私たちは「正しい」アプロヌチを埅぀こずに非垞に満足しおいたす。

try提案は、゚ラヌチェックの問題に察凊するために私たちが芋぀けたコミュニティの貢献からの倚倧な助けを借りた最小限の解決策に関するものです。 try提案は、すべおの゚ラヌテストで特定の方法で゚ラヌを凊理する必芁がある堎合、「たったく圹に立たない」ずいう事実に぀いお非垞に明確です。 tryは、関数内のすべおの゚ラヌが同じ方法でテストおよび凊理される堎合そしお、 deferを䜿甚するこずをお勧めしたす、たたは単に返される堎合にのみ圹立ちたす。 ここでより明確にするのは難しいですが、提案が述べおいるこずを繰り返したしょう tryはすべおの゚ラヌシナリオで圹立぀わけではありたせん。 それはかなりの数の堎合に圹立ちたす。 それ以倖の堎合は、 ifステヌトメントを䜿甚したす。

@griesemer tryぱラヌが発生しやすいため、GoにはRAIIがないため、倚くの堎合、関数をそのたたにしおおくこずはできたせん。

@ sirkon 、RAIIがこの議論にどのように関連しおいるかわかりたせん。 tryの既存のパタヌンを眮き換えるif ..., err := f(); err != nil { return ..., err }しお... := try(f()) 。 tryを䜿甚しおリ゜ヌスを解攟するバグがあった堎合、それは確かに事前に存圚しおいたした。 tryの導入は、リ゜ヌス解攟のバグを匷化も防止もしたせん。

@ sirkon 、RAIIがこの議論にどのように関連しおいるかわかりたせん。 tryの既存のパタヌンを眮き換えるif ..., err := f(); err != nil { return ..., err }しお... := try(f()) 。 tryを䜿甚しおリ゜ヌスを解攟するバグがあった堎合、それは確かに事前に存圚しおいたした。 tryの導入は、リ゜ヌス解攟のバグを匷化も防止もしたせん。

スレッドを読んでください、䟋がありたした

info := try(try(os.Open(fileName)).Stat())

@sirkon私はその䟋を数回芋たした。 おもしろいこずに同意したす。 しかし、もう少し考えおみたしょう。 提案されおいるtryビルトむンは、基本的にGoコヌドにある特定の皮類の定型文の構文糖衣です。 したがっお、その䟋を元のコヌドに倉換できたす。

    f, err := os.Open(fileName)
    if err != nil {
        return err
    }
    info, err := f.Stat()
    if err != nil {
        return err
    }

そのコヌドにも同じバグがありたす。 私は確かにそのようなコヌドを芋おきたした。 try組み蟌たれおいるため、バグが曞きやすくなったり、芋づらくなったりするこずは私にはわかりたせん。

[ @ianlancetaylorが私を殎ったようです。]

@sirkonこのバグは、 tryあろうずなかろうず、すでに可胜です-Goは、悪いコヌドを曞くこずを劚げたせん。 たたは、これを奜転させお、 tryが蚱可されるべきではない理由ずしお悪いコヌドを䜿甚するこずは、説埗力のある議論ではありたせん。 代わりに、 go vetは問題のあるケヌスにフラグを立おる必芁がありたす。

deferは、関数が戻ったずきにクリヌンアップするGoむディオムであり、これはうたく機胜したす。 もちろん、ここでの正しいアプロヌチは次のずおりです。

f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())

これを以䞋ず比范しおください

f, err := os.Open(filename)
if err != nil {
   return ..., err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
   return ..., err
}

tryするず、゜ヌスは䞻な関心事であるファむルのファむル情報の取埗に集䞭したす。 埓来のアプロヌチを䜿甚するず、ほずんどの゜ヌスコヌドは起こりうる゚ラヌを懞念しおいたす。 そしおそれはすべお同じです。 ゚ラヌを装食したい堎合でも、 tryアプロヌチは矎しく機胜したす。

defer errd.Wrap(&err, "failed to do X for %s", filename)
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())

errdパッケヌゞのようなものを䜿甚したす問題32676を参照。

@griesemer
私の将来の自己実行コヌドレビュヌは、制埡フロヌメカニズムがそれ自身のラむン䞊にあるべきであるずただ叫び続けおいたす。 このアプロヌチは、珟圚の提案内で有効匷制なしですか 読みやすさに加えお、より詳现な゚ラヌ凊理ロゞックぞのリファクタリングが容易になりたす。

defer errd.Wrap(&err, "failed to do X for %s", filename)
f, err:= os.Open(filename)
try(err) // check is so much a better term
defer f.Close()
info, err := f.Stat()
try(err)

たた、このhandleぞのアプロヌチはここでは芋栄えがしたすが、耇数の延期が混乱するこずはありたせんか それずも、関数スコヌプの同期がありたすか もしそうなら、匿名の機胜には独自のスコヌプが付䞎されたすか そしおシャドりむング... eesh-誰が最初に、䜕が2番目に

これはすべお、Goコヌドを曞くための2぀の「モヌド」があるように感じたす。 そうではないず蚀っおください。

@griesemer確かに、バグは今日も発生する可胜性がありたすが、珟圚のtryの実装により、将来さらに蔓延するようになるず匷く感じおいたす。 私ができる。think.OfHasChaining。OfMethodsのほがすべおの人気のある蚀語から来た誰かが、良くも悪くも圌らに根付いおいたす。 これらの蚀語はすべお、パタヌンを自然で安党にする独自のむディオムを提䟛したす。 型システムがすべおの倀に付随する障害条件を割り圓おるように匷制するため、Goですぐに障害にぶ぀かりたす。これを回避するための合理的なパタヌンはありたせんたたは、詊行提案が存圚したせん。

この提案が受け入れられれば、圌らはif errボむラヌプレヌトを回避する方法になり、慣れ芪しんだ方法でコヌドを曞くこずができるようになりたす。 tryが䜜成される前に曞かれたstackoverflowの回答、ブログ投皿などに10幎近くのGoコヌドが含たれるこずを陀いお。 圌らはすぐにerrずifステヌトメントをtryで削陀するこずを孊びたす。 圌らは、tryプロポヌザルのStat()ように、必芁なフィヌルドにアクセスできるようになるたで、 tryラップされたコヌドを貌り付けるこずができるファむルサむズを望んでいたす。 それは圌らが慣れおいるパタヌンなので、Goを曞いおいるずきにそれを適甚するのは圓然です。 最もタヌゲットを絞ったGoOSはすべおをファむルずしお扱うため、より倚くのリ゜ヌスリヌクが発生するず想定するのが劥圓です。

それは、私が「今日すでにこれを行うこずができる」ずいう声明に匷く反察する理由に私をもたらしたす-あなたは単にできないからです。 確かに-ファむルハンドルをリヌクする可胜性がありたす。 しかし、Goはプログラマヌに、スコヌプ内に識別子を持たせおファむルをリヌクするこずをスキップする機䌚を䞎えたせん。 スキップされた各識別子fは、ファむルハンドルがリヌクされおいたす。 この機胜を䜿甚するには、Go゚コシステムの特定の著名なむディオムが壊れおいる必芁がありたす。 したがっお、今日蚭蚈された機胜を導入するず、Goでリ゜ヌスがリヌクするリスクが明らかに高たりたす。

ずはいえ、 https //github.com/golang/go/issues/32825#issuecomment -506882164で述べたように、いく぀かの小さな調敎が行われた堎合、実際にはtryをサポヌトしたすが、倉曎は蚀語ぞの远加を歓迎したした。 詊行に必芁なのは、割り圓おのRHSでのみ有効にし、戻り倀をアドレス指定できないようにするこずだけだず思いたす。 tryの䜿甚法の「良い」䟋1行に1回の詊行である傟向がありたすを、tryを䜿甚する「唯䞀の」方法にしたす。

info := try(try(os.Open(filename)).Stat()) // compiler error
f := try(os.Open(filename)) // valid
// we were forced to assign f, so we still have an identifier to Close (serve linters and users alike)
defer f.Close()
info := try(f.Stat())
a, b := try(strconv.Atoi("1")), try(strconv.Atoi("2")) // also valid 
a, b := try(strconv.Atoi("1"), strconv.Atoi("2")) // maybe?
a, b := try strconv.Atoi("1"), strconv.Atoi("2")

これは蚀語に自然に適合し、 tryの珟圚のすべおの利点を利点ず芋なす堎合はネストするこずを陀いお欠点なしで維持するず思いたす。 tryのネストは、だれにも有利になるずは思いたせん。節玄はほずんどありたせんが、悪甚の可胜性は無限にありたす。 今日は特に悪を感じおいないので、これが私にできる最善のこずです。

total := try(try(os.Open(filename)).Stat()).Size() + try(strconv.Atoi(try(ioutil.ReadAll(os.Stdin))))

しかし、あなたが私たちに任せれば、_we_は最悪のこずを考えるでしょう。

@daved try(err)を2行目に配眮するこずは、既存のtryプロポヌザルで完党にサポヌトされおいたす。 tryは、最埌の倀がerrorず入力したす。これは、 try(err)ず曞くず自然に満たされたす。

deferに関するあなたの懞念に埓うかどうかはわかりたせん。異なるハンドラヌが必芁な堎合、 deferは正しい遞択ではない可胜性がありたす。 代わりに、埓来のifが必芁になる堎合がありたす提案に明蚘されおいたす。

@cstocktonネストされたtryは非垞に問題になる可胜性があるこずに同意したす。 しかし、 tryがあれば、ほずんどのコヌドはあなたが䞎えた有効なたす。 専門家は、真空でコヌディングするのではなく、スタむルガむド、コヌドレビュヌ、およびグッドプラクティスに埓う傟向がありたす。 ですから、私はここではそれほど心配しおいたせん悪いコヌドや間違ったコヌドを曞くこずが可胜であれば、誰かがそれをするこずをよく知っおいたす-そうです。

スタむルの問題ずしお、私たちはあなたが奜むような制限を蚀語に課しおいたせん-私たちはそのためにgo vetを䜿甚したした。 結局、曞かれた゜フトりェアの堎合、効果は同じです。 しかし、それを蚀語で持たないこずによっお、私たちは自分自身を瞛り付けおいたせん。 これらの制限を適切に蚭定するのは難しいため、仕様が䞍必芁に耇雑になりたす。 go vetを調敎する方がはるかに簡単で、蚀語を調敎するよりも倚くのこずを孊ぶので、よりスマヌトになりたす。

@griesemer説明しおくれおありがずう。 コヌド䟋では、最初の行がvar err error堎合、折り返しは䞡方のチェック枈み゚ラヌに圱響を䞎える可胜性がありたすか シャドりむングが将来察凊される可胜性のある懞念事項であるずいう話を芋おきたした。 これにどのように関連する/可胜性がありたすか

tryがrecoverのような゚ラヌを芋぀けた堎合にキャッチするために、deferにcatch関数を远加するのはどうですか。
䟋

func doSomthing()(err error){
    //return error
}

func main(){
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

    try doSomthing()
}

倚くの機胜で

func Foo() (err error) {
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

   try{
    file1 := open("file1")
    defer file1.Close()
    file2 := open("file2")
    defer file2.Close()
   }
   //without try
    file3,err := open("file3")
    defer file3.Close()
 }

これは、各゚ラヌを個別の方法で凊理するのにどのように圹立ちたすか

他のナヌザヌがコミットしたように

func Foo() (err error) {
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

    file1 :=try open("file1")
    defer file1.Close()
    file2 :=try open("file2")
    defer file2.Close()

        //without try
       file3,err := open("file3")
       defer file3.Close()
 }

@davedこれらの䟋では、 errが結果errorの名前であるず想定されおいたした。 tryは、名前たたは名前がない堎合に関係なく、垞にその結果゚ラヌ倉数を蚭定したす。 errずいうロヌカル倉数がある堎合、それは別の倉数です。 結果゚ラヌを参照する堎合は、別の名前を付ける必芁がありたす。 これが無効である堎合はすでにあるこずに泚意しおください。

func f(...) (..., err error) {
   var err error // << err already declared
   ...

䞀方、あなたが曞く堎合

func f(...) (..., err error) {
   a, b, ... err := g() // redeclaration of err
   ...

割り圓おのerrは、結果パラメヌタリストで指定されたものず同じです。 ここでは、非垞に長い間すでにそうであったこずず䜕ら倉わりはありたせん。

PS try議論のためにこの問題をハむゞャックするのをやめお、元の提案に戻る必芁がありたす。ロックが解陀され、明日7月1日に再び議論できるようになりたす。

@godcong catch()関数たたは同様の関数では、゚ラヌを取埗するこずはできたすが、蚭定するこずはできたせん通垞、゚ラヌハンドラヌずしお動䜜する遅延関数で、囲んでいる関数の゚ラヌを蚭定する必芁がありたす。 。 catch()が、囲んでいる関数の゚ラヌ戻り倀のアドレスである*errorを返すようにするこずで、機胜させるこずができたす。 しかし、蚀語に新しいメカニズムを远加する代わりに、゚ラヌ結果名を䜿甚しないのはなぜですか これが説明されおいるtry提案も参照しおください。

たた、䞊蚘のPSを参照しおください。

@griesemer

ここでより明確にするのは難しいですが、提案が述べおいるこずを繰り返したしょう。詊しおみるず、すべおの゚ラヌシナリオで圹立぀わけではありたせん。 それはかなりの数の堎合に圹立ちたす。 それ以倖の堎合は、ifステヌトメントを䜿甚したす。

これはたさにtry()提案の臎呜的な欠陥だず思いたす。以前ぱラヌチェックを行う唯䞀の方法がありたしたが、今では2぀あり、コヌドベヌス党䜓に混圚しおいたす。 たた、少なくずも私が取り組んでいるコヌドベヌスでは、 if err != nil 20未満をtry()に眮き換えるこずができたす。これは重芁ではありたせんが、゚ラヌ凊理スタむルに分割したす。

個人的には、代わりにすべおのif err != nilケヌスの95を眮き換えるのに十分匷力な゚ラヌ凊理構造を奜むでしょう。 それは倚くの人が奜きだったず思いたす。

@griesemerあなたが参照しおいるスタむルガむド、グッドプラクティス、䟋、ドキュメントなどはすべお時代遅れであるため、人々が孊び、ツヌルが

ここで角床を切り替えたす。抂説した朜圚的な副䜜甚に察しお十分に匷力なtryステヌトメントをネストするためのナヌスケヌスは䜕ですか 今日のGoコヌドは、チェヌン可胜でネスト可胜で、詊行分離された括匧パヌティをどこにでも乱暎に衚瀺できるようにするこずで、どのように利益を埗るのでしょうか。 私の掚枬では、そうではなく、ネストを詊すように求められた人はいないず思いたす。関数ずしお実装されおいるため、提案に付属しおいたす。 蚀語仕様がより耇雑になるため、ネストの削陀やアドレス指定可胜などの制玄を远加しお、ネストの乱甚や埮劙な゚ラヌを制限する必芁はありたせん。 ここでのテヌマは、蚀語の耇雑さの導入を防ぐためですか、それずも゚ラヌを凊理するためのより良い方法を远加するためですか

ここでの目暙が蚀語仕様をより耇雑にしないこずである堎合、遞択は明確です。ゞェネリックリタヌンずパラメヌタヌを䜿甚しお新しい関数を远加しないでください。任意にネスト可胜で、制埡フロヌを提䟛し、指定された倀のアリティを倉曎したすしかし、それらが特定の組み蟌みむンタヌフェヌスを満たしおいる堎合に限りたす、おそらく私が忘れおいる以䞊のもの、たずえば前䟋のない耇雑さを持぀関数。 ゚ラヌ凊理を改善するこずが目暙である堎合、゚ラヌを生成する新しい方法を導入せずにそれを行う必芁があるず思いたす。

@sirkon私はその䟋を数回芋たした。 おもしろいこずに同意したす。 しかし、もう少し考えおみたしょう。 提案されおいるtryビルトむンは、基本的にGoコヌドにある特定の皮類の定型文の構文糖衣です。 したがっお、その䟋を元のコヌドに倉換できたす。

    f, err := os.Open(fileName)
    if err != nil {
        return err
    }
    info, err := f.Stat()
    if err != nil {
        return err
    }

そのコヌドにも同じバグがありたす。 私は確かにそのようなコヌドを芋おきたした。 try組み蟌たれおいるため、バグが曞きやすくなったり、芋づらくなったりするこずは私にはわかりたせん。

埓来のフロヌが「遅い」ず、ファむルを閉じる必芁があるこずに気付く䜙地が増えるこずは明らかです。このtryは、人々が長い道のりよりもショヌトカットを奜む傟向があるため、この皮のリヌクを匕き起こしたす。

@godcong catch()関数たたは同様の関数では、゚ラヌを取埗するこずはできたすが、蚭定するこずはできたせん通垞、゚ラヌハンドラヌずしお動䜜する遅延関数で、囲んでいる関数の゚ラヌを蚭定する必芁がありたす。 。 catch()が、囲んでいる関数の゚ラヌ戻り倀のアドレスである*errorを返すようにするこずで、機胜させるこずができたす。 しかし、蚀語に新しいメカニズムを远加する代わりに、゚ラヌ結果名を䜿甚しないのはなぜですか これが説明されおいるtry提案も参照しおください。

たた、䞊蚘のPSを参照しおください。

Goの型システムは60幎代に立ち埀生しおいたため、圓然、゚ッゞケヌスをうたく凊理できたせんでした。 80幎代のアむデアを借りるのに十分な先芋の明がある堎合は、゚ラヌが発生しやすい埮劙なフロヌを制埡する方法がありたす。 あなたは今、䞭䞖の村にガラスず金属の建物を建蚭しようずしおいたす。これらの䞭䞖の村には電気ず氎道のパむプがないので、あなたもそれを持っおいないのは悪いこずです。

golang/go自䜓で、新しく改善された゚ラヌ機胜がどの皋床採甚されるかを確認するのは興味深いこずです。 あったずしおも。

go2 fmtにプレヌンなgo1.xを出力するオプションがあるかどうかを確認するこずも興味深いでしょう。

私自身の経隓から、返された゚ラヌにコンテキストを远加しお以来、次のようになっおいたす。

import "github.com/pkg/errors"
func caller(arg string) error {
  val, err := callee(arg)
  if err != nil {
    return errors.Warpf(err, "failed to do something with %s", arg)
  }

  err = anotherCallee(val)
  if err != nil {
    return errors.Warpf(err, "failed to do something with %s", val)
  }

  return nil
}

サポヌトチヌムは、本番環境で発生する問題に぀いお私の意芋を必芁ずするこずはめったにありたせん。

私芋ですが、゚ラヌ凊理の改善は定型コヌドを枛らすこずではなく、゚ラヌにコンテキストを远加するためのより䟿利な方法を提䟛するず思いたす。 私はただtryを䜿甚するための良い賢明な方法を芋぀けるこずができたせん。

たぶん、延期しおコンテキストを远加したす。

func caller(arg string) (err error) {
  defer func() {
    switch t := err.(type) {
      case CalleeErr:
        err = errors.Wrapf(err, "failed to do something with %s", arg)
      case AnotherCalleeErr:
        err = errors.Wrapf(err, "failed to do something with %s", val)
    }
  }()

  val := try(callee(arg))
  try(anotherCallee(val)
  return nil
}

タむピングの倚くを節玄するようには芋えたせんが、読みやすさずパフォヌマンスを犠牲にしおいたす。

次のようにtryを䜿甚するこずになりたす。

func caller(arg string) error {
    val, err := callee(arg)
    try(errors.Warpf(err, "failed to do something with %s", arg))

    err = anotherCallee(val)
    try(errors.Warpf(err, "failed to do something with %s", val))

    return nil
  }

それは数行を枛らしたす、それだけです。

私には、この問題のほずんどの解決策は、䟋倖を䜿甚する他の蚀語から分離されおいるず私が思っおいた1぀のこずを壊しおいるように芋えたす。぀たり、゚ラヌ凊理メカニズムは制埡フロヌずしお䜿甚されたせん。 これらの゜リュヌションのほずんどは、䜕らかの圢の制埡フロヌチェック/凊理、詊行、キャッチ、期埅を远加したす。その時点で、Goチヌムは䟋倖を远加しお1日ず呌ぶ方がよいず思いたす。

ルビヌに䌌たifずreturn特別なケヌスがあればいいのですが

return err if err != nil

PS蚀語デザむンの経隓が浅いのでご容赊ください。愚かなこずを蚀った堎合は、遠慮なく指摘しお教えおください。

tryがrecoverのような゚ラヌを芋぀けた堎合にキャッチするために、deferにcatch関数を远加するのはどうですか。
䟋

func doSomthing()(err error){
    //return error
}

func main(){
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

    try doSomthing()
}

倚くの機胜で

func Foo() (err error) {
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

   try{
  file1 := open("file1")
  defer file1.Close()
  file2 := open("file2")
  defer file2.Close()
   }
   //without try
    file3,err := open("file3")
    defer file3.Close()
 }

これは、各゚ラヌを個別の方法で凊理するのにどのように圹立ちたすか

他のナヌザヌがコミットしたように

func Foo() (err error) {
    defer func(){
        if err:=catch();err!=nil{
            //found error
        }
    }()

  file1 :=try open("file1")
  defer file1.Close()
  file2 :=try open("file2")
  defer file2.Close()

        //without try
       file3,err := open("file3")
       defer file3.Close()
 }

あなたの䟋では、すべおの゚ラヌを同じdefferで凊理したす。 カスタムメッセヌゞずカスタム情報を゚ラヌに远加したい堎合はどうなりたすか

@ianlancetaylor 「掚定リタヌン」をサポヌトするために「=」挔算子を拡匵するこずを提案した人はいたすか基本的に、関数呌び出しなしでtryずたったく同じように動䜜したす。 これは私が䞡偎で芋た倚くの懞念を解決するでしょう

  • 機胜の名前ずしおのtryは、これを関数ずしお実装する限り、誰もが100満足できるかどうかわからない名前を付けるこずに固執しおいる限り、論争を呌んでいたす。
  • tryは前䟋のない数のこずを行い、 append()ような入力を持ち、ナビキタスパタヌン if err != nil の代わりにpanic()ような制埡フロヌに圱響を䞎えたす。 。
  • try入れ子は、厳密な技術的議論から導き出された付加䟡倀ずしおではなく、関数ずしお実装するずいう決定の結果です。
  • tryは、䞋䜍互換性を維持するための関数ずしお実装されおいたす

タむプのように単玔にリタヌンを掚枬するず、物事は簡朔に芋え、次のように「進む」ように感じたす。

f, err := os.Open(filename)
if err != nil {
   return ..., err
}
defer f.Close()

info, err := f.Stat()
if err != nil {
   return ..., err
}

_この動䜜の正しいコンピュヌタサむ゚ンスの説明をここに挿入したす_、それたでは、短い倉数宣蚀を介しお掚定されたリタヌンを解決したす。

f := os.Open(filename)
defer f.Close()
info := f.Stat()

これは、以䞋よりもはるかに敎然ず芋えたす。

f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())

これにより、䞊蚘のすべおの懞念が解決されたすが、私の意芋ではもう少し「奜きになる」ず感じ、䞋䜍互換性を維持したす。 説明も少し簡単に思えたすが、 try()の関数呌び出しでの「暗黙の」戻りは、他のすべおの蚀語でのtryのナビキタスな意味を考えるず、本圓に堎違いに感じたす。 実装に぀いお100話すこずはできたせんが、ほが同じ努力で実行できる可胜性があるようです。 AssignStmtは、組み蟌みず同じバック゚ンドコンパむルを通知するために、LHSのどの匏がerr倀を省略したかを指定するフィヌルドを远加できたすか

そのたたの゚ラヌチェックが奜きですが、これが本圓に解決しなければならない問題であるなら、新しいキヌワヌドがおそらくより良い解決策だず思いたす。 どの゜リュヌションにも制埡フロヌの倉曎が含たれる可胜性が高いため、それを可胜な限り明確にするこずが最善です。

この䟋では、 on errが蚭定されるたびにon条件が評䟡されたす。

func example() (foo int, err error) {
    on err != nil {
        return foo, err
    }

    foo, err = calcThis()
    foo, err = calcThat(foo)

    return
}

これは、関数シグネチャで戻り倀の名前を宣蚀しなくおも機胜したす。

func example() (*int, error) {
    var err error

    on err != nil {
        return nil, err
    }

    foo, err = calcThis()
    foo, err = calcThat(&foo)

    return &foo, nil
}

これは耇数回蚭定するこずもできたす。 䞍自然な䟋を次に瀺したす。

func example() (*int, error) {
    var err error

    on err != nil {
        return nil, err
    }

    foo, err = calcThis()

    on err != nil {
        return &foo, err
    }

    foo, err = calcThat(&foo)

    return
}

私の目には、これはGoのスタむルず読みやすさを維持しながら、各ステップで䜕が起こっおいるかを明確にしたすパラダむムを理解するず。これは、 errが蚭定されるたびにその条件を効果的に挿入するためです。

次のこずもできたす。

func example() (foo int, err error) {
    var message string

    on err != nil {
        return foo, errors.Wrap(err, message)
    }

    message = "failed to calc this"
    foo, err = calcThis()

    message = "failed to calc that"
    foo, err = calcThat(foo)

    return
}

最埌に、これにぱラヌ凊理を超えた適甚性がありたす。 foo == 0の堎合に戻りたいですか 別の䞍自然な䟋

func example(i int) bool {
    on x == 0 {
        return false
    }

    x = calcSomeInt(i)
    return true
}

@cstockton

その方法で゚ラヌを取り陀くのは少し簡単すぎるず抗議しようずしおいたしたが、次のようになりたした。

  • これは、 json.Unmarshalなどの_only_゚ラヌを返す関数を備えた「萜ずし穎」です。 IMEの優れたコヌドレビュヌアは、これを非垞に迅速に監芖するこずを孊びたす。
  • http.Handlerメ゜ッドなど、゚ラヌ倀を返さない関数では、構文゚ラヌが発生したす。
  • ゚ラヌの凊理方法を知っおいれば、それに぀いお考え、予枬し、ずにかく゚ラヌ倀をキャプチャしお、凊理できるようにするでしょう。
  • 発生した゚ラヌを他の誰かの問題呌び出し元の問題にするために単に返すこずを意図しおいる堎合、これはそれを達成したすが、コンテキストの泚釈を明瀺的に远加する機䌚を逃すずいう小さな欠点がありたす。

だから、私が考えるこずができるすべおの長所を比范怜蚎し、明らかな欠点に気付かなかった埌、私は...フェンスにいたす。 私が考慮しおいない明らかでない欠点があるのではないかず思いたす。 しかし、私はこれがどこに向かっおいるのかが奜きになり始めおいたす。

私はこれが正しい察応方法であるこずを願っおいたす、そしお私はコミットしおいたせん
深刻なフェむクパス。

7/1/19で、クリス・ストックトン[email protected]は曞きたした

@ianlancetaylorサポヌトするために "="挔算子を拡匵するこずを提案した人はいたすか
「掚定リタヌン」-基本的に、関数なしで詊しおみるのずたったく同じように動䜜したす
電話。 [...]

この堎合、私が興味をそそられるのは、私たちが䜕かを持っおいるずいうこずです
「commaOK」パラダむムに類䌌しおおり、「err」が省略されおいたす。
譲受人は、明確に定矩された状況䞋で蚱可されたす。 䟡倀
泚意したすが、これを有効にするのにそれ自䜓では明らかに十分ではありたせん
呜題。

ルシオ。

このバグはすでに発生しおいる可胜性がありたす。詊しおみおもどうかは関係ありたせん。Goを䜿甚しおも、䞍正なコヌドの蚘述を防ぐこずはできたせん。 たたは、これを奜転させお、詊行が蚱可されるべきではない理由ずしお悪いコヌドを䜿甚するこずは、説埗力のある議論ではありたせん。 代わりに、獣医は問題のあるケヌスにフラグを立おる必芁がありたす。

@griesemer同意したせん。 キヌストロヌクを節玄できたすが、ポむンタ挔算は、䞍良で壊れたコヌドを簡単に蚘述できるずいう前提で、Goから陀倖されたした。 これは、バグの怜出をより困難にするのず同じタむプの機胜だず思いたす。

data := try(ioutil.ReadAll(try(os.Open("foo.txt"))))

tryの兞型的な䟋で

data := try(ioutil.ReadAll(try(http.Get("http://example.com/")).Body))

䞊蚘は正しいコヌドのように読み取られたすが、応答本文が完党に読み取られ、その埌ハッピヌパスで閉じられるずいう芁件は無芖されたす。 十分に長く芋おみるず、間違った䟋の嫌な優雅さは、将来これらのタむプのバグが発生するこずを明らかにするはずです。

この時点でコヌドを曞く以䞊のこずをレビュヌする人ずしお、私はGoが䞍正確さをそれほど魅力的にする機胜を远加しないこずを望みたす。

@ jesse-amano代入挔算子を䜿甚するず、明瀺的な代入ステヌトメントがないず、実際にはこのケヌスが発生しなくなりたす。以䞋は、今日ずたったく同じように動䜜したす。

json.Unmarshal(...)
(http.Handler)(h).ServeHTTP(w, r)

゚ラヌを返すだけの倀に぀いおは、 return json.Unmarshal(...)ように返される資栌があり、ifブロックの倖偎に倀が存圚する必芁がないため、よりコンパクトな圢匏で衚すこずもできたす。

if err := json.Unmarshal(...); err != nIl {
    return err
} 

この堎合、私が興味をそそられるのは、「comma OK」パラダむムに類䌌したものがあるこずです。ここでは、明確に定矩された状況では、「err」担圓者を省略できたす。 泚目に倀したすが、これを有効な提案にするのにそれ自䜓では明らかに十分ではありたせん。

動䜜は、芪たたは任意のネストずチェヌンなしで詊すのず同じです。 倧倚数の人が蚀葉を壊さずに自然に感じるものを芋぀けるのは難しいず思いたす。 Goの䜜者はこのタむプの機胜をGoに远加するこずをかなり決心しおいるようですので、珟圚の圢匏のtryはGoに適しおいないこずを絶察に確信しおいるので、代替案を深く掘り䞋げおいたす。 これは私が考えるこずができる最も近いものであり、BCを壊すこずはありたせんが、それでも十分な数の人々にずっお正しいずは感じられないかもしれたせん。 いずれにせよ、トラむの提案が拒吊されるか、誰かがもっず倚くの人が同意できる䜕かを思い぀くこずを願っおいたす。

線集@ jesse-amano申し蚳ありたせんがあなたのポむントを完党に逃したした ゚ラヌを返さない関数内にいるず、兞型的な割り圓おカりントの䞍䞀臎のコンパむル゚ラヌが衚瀺されるず思いたすか 詊しおみるず、おそらくそのための新しいタむプのコンパむラ゚ラヌメッセヌゞが衚瀺されるず思いたす。

@beoran https://github.com/golang/go/issues/32825#issuecomment -507126700に぀いお゚ラヌ凊理は状況ごずにすでに異なりたす゚ラヌを倉曎せずに返す堎合もあれば、装食された゚ラヌを返す堎合もありたす。゚ラヌが発生した堎合、゚ラヌを正しく無芖できる堎合がありたす。 それらがすべお共有する唯䞀のこず゚ラヌを無芖する堎合を陀くは、 err != nilテストですこれはすでに耇数の方法で実行できたす。 新しい蚀語機胜がこれらすべおのケヌスたたはそれらの95をキャプチャするのは良いこずですが、そのような構造は、すでに持っおいる他の制埡構造ず非盎亀的に干枉する可胜性が非垞に高くなりたす。 ぀たり、私たちが期埅できる最善の方法は、これらのケヌスのいく぀かおそらく、20、おそらく50を改善するこずです。

@cstockton https://github.com/golang/go/issues/32825#issuecomment -507136111に぀いおネストされたtryが残っおいる唯䞀の障害であり、 go vetでは䞍十分な堎合、ネストされたtry犁止するこずを怜蚎できるず思いたす-それは十分に簡単です。 しかし、珟時点では、私たちはただFUD恐怖、䞍確実性、疑いの段階にあり、実際にtryを真剣に実隓した人は誰もいないず思いたす。 私はそうしおいる人々が前向きに報告したこずに泚意したす。

PS try問題は、フィヌドバックのために再び開かれおいたす。 あそこを続けたしょう。

@cstocktonああ、絶察に。 明確にするために、私が目指しおいたのは、ほずんどの堎合、゚ラヌ倀をキャプチャせずにjson.Unmarshalような関数を呌び出すこずは_すでに_悪い習慣ですが、通垞はdefer file.Close()代わりに悪い習慣ずは芋なされないずいうこずdefer func() { err = file.Close(); if err != nil { ... }; }() 、そしお私たちはかなり簡単に違いを芋分けるこずを孊びたした。 したがっお、それはおそらくあなたの提案された倉曎に䌎うでしょう。 私は圓初、誰かが゚ラヌを凊理する぀もりで無邪気にfoo := strconv.ParseFloat(bar, 64)を䜿甚しおいるず思いたしたが、簡単に怜蚎した結果、結局のずころ問題ではないず思いたす。

@sirkon https://github.com/golang/go/issues/32825#issuecomment -507167388に぀いおこのような明らかに修食されおいないステヌトメントは、議論から陀倖しおください。ここには堎所がありたせん。 念のために蚀っおおきたすが、Goのアむデアの倚くは、実際には60幎代ではなく80幎代のものパッケヌゞ、個別のコンパむルなどであり、倚くははるかに若いものですゎルヌチン、むンタヌフェむス。 これらのアむデアはただ叀いように芋えるかもしれたせんが、それらは時の詊緎に耐えおきたした少なくずもCSが出回っおいるわずかな時間。

@turtleDev https://github.com/golang/go/issues/32825#issuecomment -507231353に぀いおGoは䟋倖凊理を行い、 panicずdeferずrecover -この甚語にはGoにずっお誀解を招くような意味合いが含たれおいるため、「䟋倖凊理」ずは呌びたせん。 ただし、明確にするために、Goはtry-catchでraiseが実行できるすべおのこずを実行できたす try-catchずは察照的に、 deferを䜿甚できるため条件付き。 ありがずう。

@sorenvonsarvort https://github.com/golang/go/issues/32825#issuecomment -507268293に぀いおケヌスごずに異なる゚ラヌ装食が必芁な堎合は、 ifステヌトメントを䜿甚しおください。 デザむンドキュメントをご芧ください。 この質問はこれたで䜕床も答えられおきたした。 ありがずう。

@cstockton https://github.com/golang/go/issues/32825#issuecomment -507306652に぀いおはい、そのようなメカニズムに぀いお考えたした。 具䜓的には、「テヌブルをめくる」こずを考え、 tryを提䟛する代わりに、゚ラヌハンドラヌを宣蚀するhandle提䟛するだけです。 ハンドラヌが存圚する堎合そしおその堎合のみ、割り圓おのLHSにerrを残すだけで、暗黙的にチェックされたす非衚瀺のtry 。 芋た目は良いですが、完党に芋えないので、倧きな赀い旗です。 䟋倖凊理をコヌド内のあらゆる堎所で明瀺的に衚瀺する必芁がありたす。 それがなければ、コヌドを読んで゚ラヌチェックがどこで起こっおいるかを確認するこずはほずんど䞍可胜です。

@griesemer明確にしおくれおありがずう。 しかし、パニックずリカバリヌには異なるナヌスケヌスがあり、ほずんどの堎合、プロダクションコヌドベヌスで芋぀けるのは非垞に困難です。 そのため、フロヌ構造の制埡は限られた量しかありたせん。 新しいコンストラクトを远加するず、returnのようなこずを行うフロヌコンストラクトの新しいコントロヌルがあるため、その䞀貫性が倱われたす。

@ matthew-noken https://github.com/golang/go/issues/32825#issuecomment -507323973に぀いおあなたは興味深いアむデアを提案しおいたす。 デバッガヌのりォッチポむントメカニズムに非垞によく䌌おいたす。 答えなければならないいく぀かの質問がありたす onブロックは戻る必芁がありたすかそうでなければスパゲッティコヌドの土地に入るので、私はそう思うでしょう そのようなonステヌトメントを耇数持぀こずはできたすか on条件はどのくらい耇雑になる可胜性がありたすか割り圓おごずに評䟡する必芁がありたす onステヌトメントで倉数を䞀意に識別する必芁があるため、任意の匏を䜿甚できないこずに泚意しおください。 たた、Goのややアナテマ on構造は、他の堎所で実行される目に芋えないコヌドを意味したす。

これをさらに詳しく調べたい堎合は、他の堎所golang-nuts、たたは別の新しい提案でこれに぀いお議論するこずをお勧めしたす。 ありがずう。

@as https://github.com/golang/go/issues/32825#issuecomment -507345821

ポむンタ挔算は、悪い、壊れたコヌドを簡単に曞くこずができるずいう前提で、Goから陀倖されたした

実際には、ガベヌゞコレクションが困難たたは䞍可胜になるため、陀倖されたしたもちろん、安党でないコヌドを䜜成するこずもできたす。 しかし、ここでより重芁な点は、この決定を裏付ける具䜓的な蚌拠ず経隓があったずいうこずです。

ネストされたtryが普及たたは䞀般的になるずいう経隓や蚌拠はただありたせん。 ただし、 https //github.com/golang/go/issues/32825#issuecomment-507358397を参照しお

@turtleDev https://github.com/golang/go/issues/32825#issuecomment -507368167に぀いお panicは_正確に_䟋倖であり、遅延関数内のrecoverは本質的にcatch 。 Goでは䟋倖を䜿甚しおコヌドを蚘述するこずはお勧めしないため、本番コヌドでは芋぀けるのが難しい堎合がありたす。 それらは䟋倖的な状況でのみ䜿甚されるべきです。

制埡フロヌ構造の数に぀いお提案は、 tryが単なるシンタックスシュガヌであり、他には䜕もないこずを非垞に明確にしおいたす。

私はこのスレッドのこのスレッドの最近のコメントのいく぀かに答えようずしたした。 しかし、実際のtry号32437のtry提案に察する新しいコメントを続けたしょう今日の時点で再びロックが解陀されたした。 この問題はleave err != nil alone議論のために予玄しおおいおください。 ありがずう。

@cstockton https://github.com/golang/go/issues/32825#issuecomment -507306652に関する別のコメントこれを実装した堎合は、

    func f() int { ... }
    ...
    x := f()

に倉曎したす

    func f() (int, error) { ... }

x := f()が突然、静かに倧きく異なるこずを意味したす。

@lparがすべおのgoリポゞトリで実行したした。 結果はこの芁点にありたす https 

@ianlancetaylor私は実際、これはほずんどの堎合非垞にうたく機胜し、より良い゚ラヌ報告を導入するこずによる圱響をはるかに少なくするず感じおいたす。 2぀の䞻なケヌスの完党な䟋を考えおみたしょう。最初に、呌び出し元が゚ラヌを返したす。

func f() int { ... }
func a() error {
    x := f() // if f() is updated to return an error, we get automatic error propagation by default
    ...
}

func b() {
    x := f() // if f() is updated to return an error, we get the same compiler error 
    // assignment mismatch: 1 variable but pkg.f returns 2 values
}

䞀般的なケヌスでは、これはこのアプロヌチの良い利点だず思いたす。これが問題を匕き起こすコヌナヌケヌスは、すでに脆匱であるず私は信じおいたす。 本圓に厄介であるず私が考えるこずができるのは、ミュヌテックスをデッドロックするこずだけです。

func (t *T) a() error {
   t.mu.Lock()
   x := f() // if f() is updated to return an error, we get automatic error propagation by default
   if x > 15 {
     t.mu.Unlock()
     return errors.New("t > 15")
   }
   ...
}

しかし、そのように蚘述されたコヌドは、有効なプログラム状態を持぀ために成功するために倖郚ラむブラリ呌び出しに䟝存しおいる堎合、すでにデッドロックの圱響を受けやすいず思いたす。 パニックを超えお存続できるスコヌプに栌玍されおいる堎合、同じラむブラリがNPEを介しおランタむムパニックを匕き起こすず、デッドロックが発生する可胜性がありたす。 さらに、このようなコヌドを䜜成する䞻な動機は、ヒヌプ䞊に存圚する延期者の取埗原䟡です。 スタック䞊に存圚するシングルディファヌのパフォヌマンスが向䞊しおいるため、このようなコヌドは実際には必芁ありたせん。 このタむプの゚ラヌの掟生は簡単に修正できるず思いたす。

最埌に、ツヌルで「詊行」の欠点をサポヌトするずいう議論のように、ここでも適甚できたす。 go-modulesの採甚が増えおいるこずを考えるず、ナヌザヌの顔の前にそのような倉曎を明確に衚瀺するために、「ラむブラリアップグレヌドリンティング」ステップを泚入する絶奜の機䌚がありたす。

@griesemer

制埡フロヌ構造の数に぀いお提案は、tryが単なるシンタックスシュガヌであり、他には䜕もないずいうこずは非垞に明確です。

申し蚳ありたせんが、 tryはCのようなマクロにはならないので、事実䞊、゚ンドナヌザヌにずっおはフロヌステヌトメントの別のコントロヌルにすぎたせん。

珟時点では客芳的な議論はないず思いたすので、もっず良い゚ラヌ凊理が必芁かもしれないず認めたすが、 tryは最善の解決策ではないかもしれたせん。

繰り返したすが、これらは私の意芋であり、私はそれらを代衚しおいるだけです。 Goチヌムは、これたで以䞊に倚くのこずを考えおきたず思いたす。

サむドそれは、この問題は、䞀方で1335 upvotesを持っおいるこずを奇劙なずしお私を打぀try提案32437のみ279 downvotesを持っおいたす。 これら2぀の提案は盞互に排他的であるため、これに賛成する人々がtry提案に反察するこずで、コミュニティの感情がより明確になるこずを期埅したす。

@griesemer

゚ラヌ凊理は状況ごずにすでに異なりたす。゚ラヌを倉曎せずに返す堎合、装食された゚ラヌを返す堎合、゚ラヌに察凊する堎合、゚ラヌを正しく無芖する堎合がありたす。

そこで同意したした、それだけは明らかです。

それらがすべお共有する唯䞀のこず゚ラヌを無芖する堎合を陀くは、 err != nilテストですこれはすでに耇数の方法で実行できたす。 新しい蚀語機胜がこれらすべおのケヌスたたはそれらの95をキャプチャするのは良いこずですが、そのような構造は、すでに持っおいる他の制埡構造ず非盎亀的に干枉する可胜性が非垞に高くなりたす。 ぀たり、私たちが期埅できる最善の方法は、これらのケヌスのいく぀かおそらく、20、おそらく50を改善するこずです。

提案されたtry()ステヌトメントもifずreturnを非盎亀的に「干枉」するので、その議論は正しくないず思いたす。 ここの䜕人かの人々はたさにその理由でtry()を嫌いたす、しかし私は同意したせん。 GoはOberonではなく、シンプルですがミニマルではありたせん。Goの方が実甚的です。

私たちが同意しないのは、あなたが認めたように、䜿甚法ず適甚性が限られおおり、 ifずreturnすでに正しく実行できる蚀語構造を気にするこずは䟡倀があるずいうこずです。 try()圧倒されお、たったく持っおいたくないず思いたす。 リタヌンず盎亀しおいなくおも、より匷力で䞀般的に圹立぀try()は、おそらくほずんどのGoプログラマヌが望んでいるものです。

@beoran 、

あなたは「より匷力な」「より䞀般的に圹立぀」 try()が欲しいず曞いた。

@griesemerは4぀の状況に蚀及したした

  1. ゚ラヌを倉曎せずに返したす
  2. 装食された゚ラヌを返す
  3. ゚ラヌに基づいお行動する
  4. ゚ラヌを無芖する

try() 、蚭蚈により1を解決したす。これは文字通りif err != nil { return ..., err }ショヌトカットです。

既存の蚀語構造は3ず4を​​解決したす。 if err != nil { ... }゚ラヌに察凊するこずはすでに可胜であり、その堎合、より簡朔な構造を芋぀けるこずは困難です。 _゚ラヌはすでに無芖できたす。

これにより、2が残りたす装食された゚ラヌを返したす。 try()提案では、deferステヌトメントを䜿甚しお゚ラヌを装食するか、各゚ラヌを異なる方法で装食する必芁がある堎合は、暙準のif err != nil { ... }構造を䜿甚するこずをお勧めしたす。

理由は提案のこの郚分でよく説明されおい

この提案の最初の反埩は、゚ラヌ凊理の䞻芁郚分からの2぀のアむデアに觊発されたした。これは、挔算子ではなく組み蟌みを䜿甚するこずず、新しい゚ラヌハンドラ蚀語構造ではなく゚ラヌを凊理するための通垞のGo関数です。 その投皿ずは察照的に、゚ラヌハンドラヌには、問題を単玔化するために固定関数シグネチャfunc(error) errorたした。 ゚ラヌハンドラは、゚ラヌが発生した堎合、囲んでいる関数からtry返される盎前に、 tryによっお呌び出されたす。 次に䟋を瀺したす。

handler := func(err error) error {
        return fmt.Errorf("foo failed: %v", err)  // wrap error
}

f := try(os.Open(filename), handler)              // handler will be called in error case

このアプロヌチでは、効率的なナヌザヌ定矩の゚ラヌハンドラヌを指定できたしたが、明らかに正しい答えがない倚くの質問も開かれたした。ハンドラヌが提䟛されおいるがnilの堎合はどうなるでしょうか。 tryパニックになるべきですか、それずも存圚しない゚ラヌハンドラヌずしお扱うべきですか ハンドラヌがnil以倖の゚ラヌで呌び出され、nilの結果を返した堎合はどうなりたすか これは、゚ラヌが「キャンセル」されたこずを意味したすか たたは、囲んでいる関数はnil゚ラヌで戻る必芁がありたすか オプションの゚ラヌハンドラヌを蚱可するず、プログラマヌが適切な゚ラヌ凊理を完党に無芖するようになるかどうかも明確ではありたせんでした。 たた、どこでも適切な゚ラヌ凊理を行うのは簡単ですが、 try 1回発生するのを芋逃したす。 などなど。

次の反埩でdefer 、゚ラヌラッピングに

[...]

䜕らかの圢で明瀺的に提䟛された゚ラヌハンドラヌ関数、たたはその他の远加パラメヌタヌを䜿甚するのが良い考えであるず将来的に刀断した堎合、その远加の匕数をtry呌び出しに枡すこずは簡単に可胜です。

あなたはこの掚論に同意したせんか

私は提案のこの郚分を知っおいたすが、それに同意したせん。゚ラヌハンドラヌを枡すずいう考えのために質問が開かれたずいう事実は、そのような機胜が必芁ないずいう意味ではないからです。 それは、合理的な方法でそれらの質問に答えるためによく考えなければならないこずを意味したす。

さらに、今では、4぀の゚ラヌナヌスケヌスすべおをif err != nilステヌトメントで凊理したす。これは、広く理解されおいる、䞀貫性のあるGoむディオムです。 ケヌス1にtry()のみを䜿甚し、堎合によっおはケヌス2にのみ、deferステヌトメントで゚ラヌラッピングを実行するオヌバヌヘッドを気にしない堎合は、゚ラヌ凊理のコヌドがif分割されるこずを意味したす。 try䞀貫性がなく、゚ラヌ凊理が倉曎された堎合は、䞀方ず他方を切り替える必芁がありたす。

すべおの堎合に䜿甚できるtry()のより匷力なバヌゞョンでは、ほずんどの堎合try()を䜿甚でき、これがGoの新しい䞀貫した゚ラヌ凊理むディオムになりたす。

ただし、珟圚のtry()では、十分に広く適甚できるわけではなく、前述の゚ラヌ凊理の䞍敎合をコヌドベヌスに導入するのに十分な利䟿性が埗られおいたせん。 そのため、珟圚のtry()提案に圧倒され、䜕もしない方が良いず思いたす。

@beoranケヌス1ず2は、関数から゚ラヌを返すのが共通しおいるず思いたすそれぞれ装食なしずありが、ケヌス3ず4は返したせんそれぞれ゚ラヌに察凊し、゚ラヌを無芖したす。 'try `の焊点はケヌス1ず2にあるず思いたす。

オプションのハンドラヌ関数を受け入れるこずにより、ケヌス1ず2を凊理するようにtry()プロポヌザルを改善できるずしたらどうでしょうか。 もちろん、これには提案にリストされおいる質問に察する合理的な答えを芋぀ける必芁がありたすが、それは扱いやすいようです。 そのようなものをサポヌトしたすか

ここに私がいたす。 この堎合、ナヌザヌに゚ラヌをチェックしおもらいたい堎合は、チェックされた゚ラヌチェックされた䟋倖のようなものを远加する必芁がありたす。 そうすれば、可胜な限り明瀺的になり、ナヌザヌはすべおの゚ラヌをチェックしおいるこずがわかりたす。

真面目な話ですが、私がこれらの決定を䞋したのであれば、Kotlinの?挔算子たたはさびたunwrap()動䜜のようなものを再利甚したいず思いたす。

これらのいずれかが改善されるず思いたす。

getFile()?.getPath()?.toString()

あなたが取埗する堎所nil垰りに沿っお゚ラヌが発生した堎合たたは

get_file().unwrap().get_path().unwrap().lossy_to_string()

゚ラヌが発生した堎合、途䞭で爆発したす。 Rustは、衚珟力豊かなmatch関数を䜿甚しお、゚ラヌを培底的に怜玢し、それぞれを個別に凊理しお、チェヌンの䞊䜍にある皮類の倀を返すこずで、2番目を凊理したす。

7/2/19に、NicolasGrillyの[email protected]は次のように曞いおいたす。

@beoranケヌス1ず2は、共通しお゚ラヌを返すず思いたす。
機胜それぞれ装食なしず装食あり、ケヌス3ず4
しないでくださいそれぞれ゚ラヌに察凊し、゚ラヌを無芖したす。 'try `だず思いたす
焊点はケヌス1ず2にありたす。

私の提案に぀いおこれ以䞊の議論が芋られないこずに少しがっかりしおいたす
「゚ラヌリタヌン」の「リタヌン」郚分である必芁があるこず
「゚ラヌ」の郚分ではなく、察凊したした。

それならたた、もっず公匏なアプロヌチに埓うべきだったのかもしれたせん。 私
単に提案を䜜成するのが苊手で、私はあちこちに行く傟向がありたす
堎所。

私の意芋では、ケヌス1ず2は、「倱敗」コマンドの方が適しおいたす。
ある皋床慣れた埌明確に瀺すキヌワヌド
プログラムフロヌの倉曎であり、これは察象倖です。
その完党な構文に関しお䞍䟿な䌝統。

しかし、それから続くのは、私たちがそれを奜むかどうかにかかわらず、それです
最埌の戻りパラメヌタずしおの「err」の䜍眮付けは間もなく
慣習ではなく法埋になる。 それは倚くの「意図しない」たたは
考慮に入れる必芁のある「付随的な」結果。

最小限のものから
悲惚な、日和芋的にのみ䟿乗するものもありたす
提案。 私は個人的に泚意を怠るでしょう、私はしたす
特にゎヌチヌムずロバヌトが求めおいる理由を理解する
サポヌトず抵抗がそうであるこずが刀明したこずは間違いなく傷぀いおいたす
玠晎らしい。

それは政治的むデオロギヌの衝突です、おそらく私たちはたくさん掘り䞋げる必芁がありたす
ガヌデニングの泚意が必芁な本圓のルヌツを探すために、より深く。

@lootch tryが機胜するために、゚ラヌが最埌の戻りパラメヌタヌである必芁があるこずに特に懞念がありたすか それはすでに事実䞊の慣習ではありたせんか

䜙談ですが、私たちは抵抗に぀いお「傷぀けられおいる」わけではありたせん。倧郚分は特倧の反応に憀慚しおいたす。

@griesemerは、

たくさんのGoを曞いたこずがあるずいう簡単なコメントを曞きたいず思いたす私は2009幎の最初の公開リリヌスからGoを䜿甚しおいたす-私のgithubを参照しおください゚ラヌ凊理に関する人間工孊の改善を

私はこの数幎前に十分にむラむラしたした。私は実際にパニックの呚りに砂糖を曞き、それらがほずんどチェックされおいない䟋倖のように機胜できるように回埩したした https 

゚ラヌ状態を䌝播する非垞に冗長であるが圹に立たない方法を維持するこずを人々が熱心に䞻匵しおいるのはおかしなこずに思えたす。 私は自分のコヌドおよび他のコヌドに実際のバグを曞き、発芋したした。そこでは、人々がif err != nil条件を台無しにしお、バグを䜜成したした。 これらのバグが曞き蟌たれる理由は実際にはありたせん。 静的チェックはこれらのバグを助けるこずはできたすが、なくすこずはできたせん。

゚ラヌ凊理に関する人間工孊を改善するための提案を支持したす。

提案プロセスは、 https //golang.org/s/proposal「ProposedChangestoGo」を匕甚するためのものです。
この問題は倉曎を提案しおいないので、実際には少しカテゎリ゚ラヌです。
誰かが「遞択をそのたたにしおおく」ずいうタむトルの提案を提出した堎合、提案ではないずしおそれを閉じるだけです。

しかし、実際には、この問題は32437のような他の問題の議論の延長に過ぎないので、「䜕もしない」こずを議論するのに適した堎所ずしお開いたたたにしおおきたす。

ここに特定の決定はなく、メタ決定であるずいうこずを瀺すために、提案-保留ずマヌクしたした。

サむド tryプロポヌザル32437が279の反察祚しか持っおいないのに、この問題が1335の賛成祚を持っおいるのは奇劙だず思いたす。

トラむプロポヌザルは気付いた頃にはロックされおいたので、反察祚を投じるこずはできたせんでした。 それが、この提案が最初に入力された理由でもあるず思いたす。

7/2/19に、RobertGriesemerの[email protected]は次のように曞いおいたす。

@lootch最埌にする必芁のある゚ラヌに぀いお特に懞念がありたすか
tryが機胜するためのパラメヌタを返したすか それはすでに事実䞊のこずではありたせん
倧䌚

それが「事実䞊の」石に投げ蟌たれたら、
そのドアを開けお、「゚ラヌ」をオプションの特別なものにする必芁がありたす
匕数の型ずそれを受け入れる、なぜならそこにあるすべおの正しい結果のために
倚くの堎合、倚くの間違ったものであり、
特別な方法で察凊したした。

「return」ステヌトメントを調査する必芁があるずいう考えがあれば
より深くそしおtryの提案はそのこずを瀺唆しおいるようです
方向の堎合、゚ラヌ条件は「単なる倀ではなく、
Goのアプロヌチは、
日付ですが、それでもカヌドの家です。

私はGoの巧劙なトリックのいく぀かを嫌がるナヌザヌです私は持っおいたす
x ++ずx--は機胜しないず他の堎所で述べたした-ほずんどの堎合、私はスリップしたす
時々アップ-私のコヌドではだから「詊しおみる」は私にずっおそれらの1぀のたたです、
しかし、私はその導入に原則的に反察したせん、私はただ感じたす
そんなに倚くのこずが蚀われたした、そしおそれでもすべおの可胜な欠点はそうではないかもしれたせん
明らかにされた私が芋おいるものの意図しない結果
最終的な政治的決定。 それをテストするのは良いかもしれたせん
たたは悪い。

私が芋おいるのは、パニック/回埩が悪いラップずそれの䞍正を手に入れたずいうこずです
私たちを悩たせるために戻っおきおいたす。 繰り返したすが、私はただどちらも䜿甚しおいたせん。
私は瓶の䞭で最も鋭いクッキヌではないので、私がしなければならない日を恐れたす
ずおも難しいず思いたすが、パニック/回埩が奚励されおいたした
それが適切であるたれな機䌚のためにそれらのどれもによっお扱われたせん
゚ラヌが戻っおくるだけであるずいう圌の玠晎らしいプレれンテヌションでのロブ・パむク
倀、私が正しく思い出せば、それはすべおのこずに察しおはるかに明確になるでしょう
Goはすでに゚ラヌを凊理しおいるだけでなく、必芁なしに期埅できたす
それを超えお利甚可胜な可胜なオプションの沌を探玢する
境界。

ずは蚀うものの、詊しおみるのは理にかなっおいたす。
すべお、オプション機胜。 しかし、1぀の副䜜甚はこれが䜕であるかです
亀換ずは「事実䞊の」結果はどうなるか
「゚ラヌ」型の匕数を持぀ように匷制的な゚ラヌ凊理関数
戻りパラメヌタリストの最埌にありたすか それはどのように倉化したすか
「゚ラヌは単なる䟡倀である」ずいう認識 それはどのように適合したすか
今ではもっず類䌌した「コンマOK」パラダむム これは他に䜕をしたすか
新しい原則は生じたすか

䜕より、このモグラヒルでできおいる山は
Goが人生を倉えるマむルストヌンに到達したこずを瀺したす。 ほずんど
確かに、2013幎に真実だった仮定は、もはやそうではないかもしれたせん
所有。 それは誰にずっおもニュヌスではありたせんが、Go2が
これたでのようにGo1ずの䞋䜍互換性があるこずはそれほど玠晎らしいこずではありたせん
あたりにもしっかりず提案されたした私の意芋では。

@lootch詳现な回答ありがずうございたす。 確かに、既存の蚀語を䞋䜍互換性のある方法で拡匵するこずは非垞に難しいので、その䞋䜍互換性が必芁ない堎合は、おそらく別の方法で行う可胜性があるこずに同意したす。 間もなくモゞュヌルが䞀般的になるず、厳密な䞋䜍互換性を必芁ずしない蚀語倉曎を行うこずができるようになりたす。

あなたが蚀うように、 tryはオプションのメカニズムであり、繰り返す䟡倀があるず思いたすが、その呚りのすべおのフヌプラにもかかわらず、既存のGo機胜を䜿甚しお簡単に説明できる非垞に単玔なメカニズムです。 t tryをGo ourselfの関数ずしお蚘述したすさらに蚀えば、ゞェネリックスも圹に立ちたせん。 可胜であれば、既存のコヌドで゚ラヌ凊理を行うためにtryなどのヘルパヌ関数を䜿甚するこずは非垞に䞀般的であるず確信しおいたす。 結局のずころ、゚ラヌが倀であるずいうRob Pikeの話は、たさに゚ラヌを䌎うプログラミングです。

非垞にマむナヌなヘルパヌ関数を远加するこずに関しお、誰もが自由に無芖できるほどの隒ぎがあるこずは、私にずっおただ非垞に驚きですが、人々は、特定のスタむルを匷く瀺唆するon errorなどの重芁な蚀語倉曎を真剣に考えおいたす。蚀語での゚ラヌ凊理の。

ご意芋ありがずうございたす。 これはすべお非垞に興味深いものです。

この提案がそれを議論するのに適切な堎所であるかどうかはわかりたせんが、このスレッドのtryキヌワヌドに぀いおはすでに掻発な議論が行われおいるので、今のずころトピックに぀いお怜蚎したす:)

Googleの人々は、内郚のGolangリポゞトリにtryキヌワヌドを実装し、その埌、既存のGoogleコヌドベヌスをそのキヌワヌドを䜿甚するように倉換するこずをいずわないのではないかず思いたす。 内郚のみに保持するこずで、簡単に元に戻すこずができたす぀たり、コミュニティ党䜓ではなく、単䞀の䌚瀟に負担がかかりたす。

これにより、実際の高スロットコヌドベヌスでこの機胜に関する小さなケヌススタディを行うこずができたす。 Facebookは過去にPHPの機胜ず同様のこずを行っおおり、そのようにしお、コミュニティ党䜓に提案する前に特定の機胜を埮調敎するこずができたした。

tryキヌワヌドが実際にどのように䜿甚され、実際にどのような䟡倀が远加されたかに぀いおのケヌススタディを䜜成する堎合、説埗力のあるケヌスを提䟛できたす。 それが仮想的に珟実䞖界の䟡倀を提䟛しないのであれば、それも知っおおく䟡倀がありたす。 玙の䞊では本圓に芋栄えがするものの、実際にはうたくいかない堎合がありたす。その逆も同様です。

@Freeaqingme tryがstdラむブラリでどのように衚瀺されるかを瀺す暫定CLをすでに䜜成しおいたす https 

たた、コヌドベヌスでtryhardしお、レポヌトを返すこずをお勧めしたす。

ありがずう。

@griesemer私は自分自身を明確にしおいないかもしれたせん。 Googleは独自のGoビルドを瀟内で䜿甚しおいるず思いたす。 私の提案は、䞊蚘でリンクしたパッチを内郚のGoogleビルドに適甚しおから、Googleコヌドベヌスstdlibだけでなく、特にGoで蚘述された内郚プロゞェクトを倉換するこずです。 Googleの゚ンゞニアが実際の状況で数か月間䜿甚するず、実際にどのように機胜するかに぀いおの優れた掞察が埗られたす。

もちろん、自分で適甚しお、自分のコヌドベヌスで䜿甚するこずもできたす私もそうかもしれたせん。 しかし、私は比范的小さなコヌドベヌスを持぀単䞀の開発者であるため、倚くのGoogle埓業員がそれを䜿甚する堎合、これは代衚的なものではありたせん。

個人的には、私はただこの機胜に぀いおのフェンスにいたす。 䞀方で、毎回数回のキヌストロヌクを節玄できるずいう事実に感謝しおいたす。 しかし、時々私は怠惰になるかもしれたせん結局私は人間です、そしお私ができるだけ倚くのtryステヌトメントをネストするだけです。 この機胜があれば、もう少し芏埋を身に぀けるこずができたす。 しかし、私がそうだったずしおも、コヌドベヌスがこのキヌワヌドに苊しんでいる間デバッグ可胜性、それらのラむブラリの拡匵性の芳点から、倖郚ラむブラリがこのキヌワヌドを乱甚/乱甚する可胜性がありたす。

@Freeaqingme了解したした。 確かに、内郚リポゞトリに察しおtryを実行できたす。 倉換しお元に戻すこずができるかどうかはわかりたせん。ここにはかなりのコストがかかりたす。 たた、内郚の詳现に぀いおは報告できないため、この実隓に぀いおは集蚈統蚈でしか報告できたせんでした。 ぀たり、コミュニティには私たちの䞻匵を怜蚌する簡単な方法がありたせん。 最埌に、Googleのコヌドベヌスは代衚的なものではない可胜性がありたす。

しかし、感謝したす。

@griesemer費甚のかかる䜜業になる可胜性があるこずを感謝したす。 その堎合、私はそれをしたせん。 トラむハヌドプロゞェクトを適甚するだけの堎合は、コストが制限される可胜性がありたす。 しかし、実際には、それはGoogle瀟員私はそうではありたせんが刀断するためのものです。

個々のGoogleプロゞェクトや内郚むンフラストラクチャに぀いお報告するこずはできないずのこずですが。 ただし、おそらくいく぀かの逞話を共有するこずができたす。 しかし、私が個人的にもっず䟡倀があるず思うのは、それがどのように機胜したかに぀いお報告しおいるGoogle瀟員です。 詳现に立ち入るこずなく、「Xを期埅しおいたしたが、AやBIのようなケヌスに遭遇したずき、Yが芋぀かった」などのステヌトメントは非垞に䟡倀がありたす。 そのような皮類のレポヌトを怜蚌する必芁はありたせん。

最埌に、Googleのコヌドベヌスは代衚的なものではない可胜性がありたす。

そうかもしれないし、そうでないかもしれない。 しかし、Googleで働いおいる人はたくさんいるので、コヌドベヌスのほずんどは、1人の個人がどのように蚘述したかではなく、倚くの異なる貢献者埓業員の貢献の集倧成であるず思いたす。 その点で、私は物事が埗るこずができるのず同じくらい代衚的なものになるこずを期埅しおいたす。 100代衚的なコヌドベヌスのようなものはおそらくないでしょう。

より良い解決策が芋぀かるたで、 tryは私たちが探しおいたものではありたせん。 これに察しおバむアスアクションを実行する必芁はありたせん。時間をかけおGoAuthorsを実行しおください。 私が毎日䞖界䞭のgopherず話しおいる限り、Goコミュニティの倧倚数はtry提案のATMを受け入れおいないず匷く信じおいたす。

新しい構文を導入するずいうこずは、誰もがGoバヌゞョンをアップグレヌドする必芁があるこずを意味したす。 私のワヌクフロヌはgo getものをコマンドラむンから䜿甚できるずいう事実に基づいおいるため、私はただGo 1.10を䜿甚しおいたす私のGOPATHは私のPATH  。 最近、モゞュヌルを䜿甚する他の誰かのラむブラリをgo getしようずしたずきに問題が発生したした。 .../v2が利甚できないずいう゚ラヌが発生したした。 これは、コヌドがすでに分割されおいるこずを意味したすPython 2ず3を考えおみおください。 私にずっお、Go1.11の前ずGo1.11の埌の䞖界がありたす。 これは非垞に煩わしく、Goでの゚ラヌ凊理ず同様に機胜するものに新しい構文を導入するこずは、良いトレヌドオフではありたせん。 それはより倚くの断片化をもたらしたす。

7/4/19で、gonutz [email protected]は曞きたした

新しい構文の導入は、誰もがGoをアップグレヌドする必芁があるこずを意味したす
バヌゞョン。 私のワヌクフロヌは事実に基づいおいるため、私はただGo1.10を䜿甚しおいたす
go getものをコマンドラむンから䜿甚できるこずmy
GOPATHは私のPATH 。 最近、 go getしようずしたずきに問題が発生したした
モゞュヌルを䜿甚する他の誰かのラむブラリ。 .../v2が
利甚䞍可。 これは、コヌドがすでに分割されおいるこずを意味したす考えおみおください
Python 2および3。 私にずっお、Go1.11の前ずGo1.11の埌の䞖界がありたす。
これは非垞に煩わしく、機胜するものに新しい構文を導入したす
Goでの゚ラヌ凊理ず同様に、良いトレヌドオフではありたせん。 それ
より倚くの断片化を導入したす。

それが慰めであるならば、私は察しおたったく同じ立堎にいたす
Goモゞュヌル。 慣れるための時間ず機䌚が芋぀かりたせんでした
圌らず䞀緒なので、私もGo1.10にこだわっおいたす。 倚分それはあるべきです
持぀䟡倀のある調査。

ルシオ。

-
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください。
https://github.com/golang/go/issues/32825#issuecomment -508372318

-
ルシオデレ
2 Piet Retief St
ケステル東郚自由州
9860南アフリカ

Ph。+27 58 653 1433
セル+27 83 251 5824
FAX+27 58 653 1435

私は新しいgolang開発者ですただgoに぀いお孊んでいたす。 ゚ラヌを管理しやすいので、珟圚の゚ラヌ凊理は良いず思いたす。 Android開発者ずしお、私はtry-catchがgolangのif err != nil{ }よりも゚ラヌを管理するのが難しいず思いたす。 そしお、明瀺的な゚ラヌ凊理は、暗黙的な゚ラヌ凊理よりも垞に優れおいるず思いたす。

PS。 私の蚀語でごめんなさい。

leave it alone

壊れおない 。

ミヌムが倧奜き、 @ Daniel1984 :-)

ちなみに、 try提案では、 if err != nilはそのたたになりたす。 それはあなたにそれが理にかなっおいる远加のオプションを䞎えるだけです。

私はtryを含めるべきではないず考えおいたす。 try含めるこずに぀いお

プロ

  • プログラマヌは、キヌストロヌクの数を枛らしたす。
  • プログラマヌは、マクロの珟圚の関数から戻るための省略圢を持぀こずができたす。
  • 必須ではありたせん。
  • 䞀般的に䜿甚されたす。
  • 魔法がどこで起こっおいるかは明らかですJavaのthrowsずは異なりたす。
  • nil小切手の海を芋おいるずきに、目が釉薬をかけなくなりたした。
  • 単玔な実装で最適に機胜したす。

短所

  • tryは、既存の操䜜に重耇するメ゜ッドを远加したす。
  • tryが珟圚の関数から戻るのは予想倖であり、別名、より魔法のようなものです。
  • ゚ラヌチェックに䞍敎合が远加されたす。
  • Goの経隓がないプログラマヌは理解できたせん。
  • ゚ラヌ凊理は倉曎されたせん。
  • 明確床が䜎い関数の戻り倀ず匏の倀の䞍䞀臎。
  • tryで䜕が起こっおいるのかを蚀葉で説明するこずすら難しい。

@griesemerそれはたさに私が奜きではないものです。 物事は単玔でなければなりたせん。同じこずを達成するための2぀の方法があるだけで、蚀語に耇雑さを加えたくありたせん。 このif err != nil冗長性を回避するためのパタヌンがありたす。 https://www.ardanlabs.com/blog/2019/07/an-open-letter-to-the-go-team-about-try.html

Go2提案32437は、蚀語に新しい構文を远加しお、 if err != nil { return ... }ボむラヌプレヌトの煩わしさを軜枛したす。

さたざたな代替案がありたす。元の提案は普遍的に愛されおいないため、32804ず32811です。

ミックスに別の遞択肢を投げるにはそのたたにしおみたせんか

if err != nil構造の明瀺的な性質が奜きになったので、このために新しい構文が必芁な理由がわかりたせん。 本圓にそんなに悪いの

非垞にこれ。 明瀺的なコヌドは正しいコヌドです。 䟋倖ハンドラヌで私が芋た恐怖は、そのひどい読めない構造から氞遠に離れるのに十分です。

人々がコメントするだけで、倧きな遅れがあるようです
今、それが新鮮であるずいう印象を埗るのは仕方がありたせんでした
圌らぞのニュヌス。

それも考慮に入れる必芁がありたす。 ブドりの朚は明らかにそうではありたせん
人が考えるかもしれないように速い。

ルシオ。

そしお、gofmtを倉曎しお、単玔なハンドボヌルず゚ラヌが発生するたでの単䞀行のifステヌトメントを蚱可したす。
関数を呌び出したす。 それは倚くの混乱を取り陀くでしょう。

それ以倖の

err = myFunction
if err= nil {
゚ラヌを返す
}

蚱可する

err = myFunction
if err= nil {return err}

ちなみに、tryプロポヌザルはerr= nilだけの堎合は終了したす。 それはあなたにそれが理にかなっおいる远加のオプションを䞎えるだけです。

この正確な正圓化は、Goがさらに別のC ++、C、Scala、Kotlinなどになる方法です。「䜿いたくない堎合は䜿甚する必芁はありたせん」は、機胜が肥倧化した蚀語を䜜成する方法です。

線集-これは間違った方法に出くわした可胜性がありたす。 tryがGoを機胜の肥倧化した蚀語に倉えるず蚀っおいるのではありたせん。 ここでの正圓化には少し欠陥があるず蚀っおいたす

@deanveloper 「try」で゚ラヌの動䜜を理解するのが難しい䟋がはっきりずありたす。
https://github.com/golang/go/issues/32437#issuecomment -498932961

少し繰り返したすが、OPに同意したす。
さらに、提案されたすべおの代替案は、圹に立たない耇雑さをもたらしたす。

スコヌプ内に1行しかない堎合は、䞭括匧を省略するず䟿利です。

@怒る

これは、コヌドがすでに分割されおいるこずを意味したすPython 2ず3を考えおみおください。 私にずっお、Go1.11の前ずGo1.11の埌の䞖界がありたす。

私は長い間Pythonプログラマヌであり、Goモゞュヌルに関しおあなたが蚀及したずされる「分割」は、Python2からPython3ぞの移行の惚事に匹敵するものではありたせん。

これは非垞に煩わしく、Goでの゚ラヌ凊理ず同様に機胜するものに新しい構文を導入するこずは、良いトレヌドオフではありたせん。 それはより倚くの断片化をもたらしたす。

tryは、プロポヌザルに組み蟌たれおいる関数です。 完党な䞋䜍互換性がありたす。 コヌドがすでにtryを識別子ずしお䜿甚しおいる堎合、その識別子はtryビルトむンをシャドりむングしたす。

@pongsatornw

゚ラヌを管理しやすいので、珟圚の゚ラヌ凊理は良いず思いたす。 Android開発者ずしお、golangでerr= nil {}を実行する堎合よりも、try-catchで゚ラヌを管理するのは難しいず思いたす。 そしお、明瀺的な゚ラヌ凊理は、暗黙的な゚ラヌ凊理よりも垞に優れおいるず思いたす。

提案を完党に読みたしたか tryは、 if err != nil { return ..., err }繰り返しを陀倖するのに圹立぀組み蟌み関数です。 Goでの゚ラヌ凊理の䞀般的なロゞックは同じたたです。 それはただ明瀺的であり、゚ラヌは䟝然ずしお倀であり、try-catch別名䟋倖はありたせん。

@kroppt

  • tryは、既存の操䜜に重耇するメ゜ッドを远加したす。

tryは、反埩的なコヌドを因数分解しおいるだけです。 appendず同じです。 スラむスに芁玠を远加するたびに自分で曞くこずができたすが、 appendを呌び出す方が簡単です。

  • ゚ラヌチェックに䞍敎合が远加されたす。

䜕をするかに応じお、 [...:...]を䜿甚しおスラむスを「手動で」操䜜するこずも、 appendを䜿甚するこずもできたす。 矛盟はありたせん。 これらは、タスクごずに異なるツヌルです。 ゚ラヌに぀いおも同じですが、手元のタスクに応じお、プレヌンなif err != nil { ... }たたはtryを䜿甚したす。

  • tryが珟圚の関数から戻るのは予想倖であり、別名、より魔法です。

新品なので意倖です。 䜿うほど慣れおきたす。 そしお、私はそれが魔法だずは思いたせん。 tryの仕様は非垞に簡単です。

  • Goの経隓がないプログラマヌは理解できたせん。
  • tryで䜕が起こっおいるのかを蚀葉で説明するこずすら難しい。

Goの経隓がないプログラマヌはchan 、 defer 、 'go , iota ,パニック,回埩,理解したせん, type assertions, and many other things either without reading the documentation. try`は、これのほずんどに比べお簡単です。

  • ゚ラヌ凊理は倉曎されたせん。

if err != nilを攟っおおくように頌むgophersによるず、それは良いこずかもしれたせん;-)

@marcopeereboom

明瀺的なコヌドは正しいコヌドです。 䟋倖ハンドラヌで私が芋た恐怖は、そのひどい読めない構造から氞遠に離れるのに十分です。

tryは、䟋倖凊理ずはたったく関係ありたせん。 提案党䜓を読みたしたか たずえば、JavaやPythonのような䟋倖凊理に匹敵するものはありたせん。 tryは明瀺的です。 ゚ラヌは関数のシグネチャに蚘茉する必芁がありたす。 ゚ラヌは、コヌルサむトで凊理する必芁がありたす。 スタックの巻き戻しはありたせん。 NS。

@ gale93

スコヌプ内に1行しかない堎合は、䞭括匧を省略するず䟿利です。

ほずんどのgopherは同じ考えを持っおいたず思いたす。私は、IssueTrackerで同様の提案を䜕床も読みたした。 しかし、それはtryよりもはるかに倧きな倉曎です。 ifステヌトメントだけでこれを行うのは合理的ではありたせん。 したがっお、ブロックが受け入れられるすべおの堎所でこれを倉曎する必芁がありたす。 {がブロックの開始をマヌクしない堎合、条件匏の終了を区切る方法を指定する必芁がありたす。 文法、パヌサヌ、gofmtなどを曎新する必芁がありたす。これにより、蚀語の衚面が完党に倉わりたす。

@ngrilly
節床を保ち、蚀語をシンプルに保぀こずが重芁です。

あなたが䜿甚した議論のいく぀かは、仕様ぞの倧幅な倉曎を正圓化する可胜性がありたす。 ここには良い点だけではありたせん。

私は、それが助けになるか害を及がすかずいうこずに基づいお決定を評䟡しおいたすが、必ずしも特定の哲孊を完党に制定しおいるわけではありたせん。 仕様の䞀郚がgoが蚭立された特定の原則に違反しおいるこずは正しいですが、それはすべお節床に関するものです。 この倉曎は、ネガティブを蚱容するのに十分なプラスの圱響を私に䞎えたせん。

こんにちは@kroppt 、

蚀語をシンプルに保぀こずは重芁です

私は同意し、私たち党員がこれに取り組んでいるず思いたす。

私は、それが助けになるか害を及がすかずいうこずに基づいお決定を評䟡しおいたすが、必ずしも特定の哲孊を完党に制定しおいるわけではありたせん。

私たちは皆、そのメリットずコストに基づいおtryを評䟡しおいるず思いたす。 議論は、これらの利点ずコストに関する事実に基づくコンセンサスを定矩しお芋぀けるこずに぀いおです。これは、以前のコメントで私がやろうずしたこずです。

仕様の䞀郚が、goが蚭立された特定の原則に違反しおいるこずは正しいです。

過去数幎間、私はGoチヌムがGoずそのデザむンに぀いお公開したほずんどすべおを読んでいたすが、Inはあなたが䜕を意味するのか理解しおいたせん。 try提案がGoの基本原則に違反しおいるずは思いたせん。

@ngrilly
https://talks.golang.org/2012/splash.articleは、 go違いの背埌にあるいく぀かの抂念、ずりわけ明快さず単玔さに぀いお説明しおいたす。 これは、私たちの䞀郚がこの新しい倉曎で目にする察立だず思いたす。 簡単ですが、あたり明確ではありたせん。 私には、単玔さの向䞊は、明快さの喪倱よりも小さいように思われたす。 倚分私は間違っおいお、ただ甚心深いです。

@kropptこの蚘事を䜕十回も読んだこずがありたす;-) tryがコヌドを難読化するずいう考えに同意したせん。 tryは、反埩コヌドを因数分解するために䜿甚される単なる組み蟌み関数です。 私たちはプログラマヌずしお垞にそれを行っおいたす。 繰り返しパタヌンを特定するずきは、新しい関数でそれを陀倖したす。 そうしないず、すべおのコヌドがむンラむン化された1぀の長いmain関数が䜜成されたす。

@ngrilly
あなたが説明しおいるこずは私の「プロ」セクションにありたす

  • プログラマヌは、キヌストロヌクの数を枛らしたす。
  • プログラマヌは、マクロの珟圚の関数から戻るための省略圢を持぀こずができたす。
  • nil小切手の海を芋おいるずきに、目が釉薬をかけなくなりたした。

繰り返しになりたすが、ここで原則を普遍的に適甚しおいないのに、原則の普遍的な適甚に぀いお蚀及する意味はありたせん。

tryがコヌドを難読化するずいう考えに同意したせん

倉曎のポむントは、コヌドを難読化/非衚瀺/簡略化/衚珟するこずです。そうしないず、元の゚ラヌチェックブロックが衚瀺されたす。 問題は、それが意味をあたり明確にしないかどうかです。

go元々、明快さを損なうのではなく、貢献するずいう点で、シンプルさの玠晎らしいバランスをずっおいたず思いたす。 圌らがどのようにそれをしたかを説明するこずはできたせんが、私の意芋ではtryは説明しおいたせん。

冗長性を問題ず芋なすべきではないず思いたす。 コヌドは人間が読んで理解する必芁がありたす—その時間はコンピュヌタヌよりも高䟡です—そしお_理解_は困難で時間のかかる郚分になる傟向がありたす。

go゚ラヌ凊理のむンデント構造は、䜕が起こっおいるのかを远跡するのに圹立ちたす。 すべおの゚ラヌチェックは明瀺的です。 ほずんどの未凊理の゚ラヌも明瀺的です。 これにより、コヌドがすぐに理解できるようになりたす。

たた、 if err != nilチェックは面倒に思えるかもしれたせんが、実際にタむプする必芁はないず思いたす。 私は自分の線集者にそれをやらせるだけです。

@kroppt

倉曎のポむントは、コヌドを難読化/非衚瀺/簡略化/衚珟するこずです。そうしないず、元の゚ラヌチェックブロックが衚瀺されたす。

ただし、この匕数は任意の関数呌び出しに䜿甚できたす。 strings.HasPrefix("foobar", "foo")を呌び出すず、コヌドが難読化されたすか l := len("foo"); len("foobar") >= l && s[0:l] == "foo"曞いたり読んだりしたすか

@rossmcf

すべおの゚ラヌチェックは明瀺的です。

tryはただ明瀺的に゚ラヌをチェックしおいたす。 それは詊緎の存圚意矩です。

たた、err= nilチェックは面倒に思えるかもしれたせんが、実際に入力する必芁はないず思いたす。

入力するのは面倒ではありたせん。 どこにでも同じ3行があるず、読むのが面倒です。 これは繰り返しであり、プログラマヌずしおの私たちは通垞、これらを陀倖する傟向がありたす。 たぶんtryは他の欠点がありたすが、これは私が思うにそうではありたせん。

tryはただ明瀺的に゚ラヌをチェックしおいたす
try抜象化ずstrings.HasPrefixの違いは、 try暗黙的に返されるこずです。
goコヌドを読むずき、実行フロヌは次のようになるたで関数内にずどたるこずがわかりたす。

  • 戻り型なしで関数の閉じ括匧を読む
  • キヌワヌドreturn 、 panic読む
  • syscall.Exit(code)読む
    tryでは、同じ方法でコヌドを読み取るこずができたせんでした。 行を芖芚的にスキャンしお「return」ステヌトメントがれロであるこずを確認しおも、「これらの行がすべお実行されるか、1぀のブロックになるか、プログラムが終了する」ずいう意味ではなくなりたす。

@ngrilly投皿FYIで耇数の人に返信できたす。数時間で10件の返信があり、䞀床に5件の返信があるず、ディスカッションをフォロヌするのが難しくなりたす。 いく぀かの誀謬を陀いおあなたの投皿を読んだ埌、私は詊しおみるこずの利点を説明する新しい具䜓的な議論が圢成されおいるのを芋たこずがありたせん。 if err != nil入力を防ぐずいう1぀の利点がありたす。 これには、リ゜ヌスをリヌク簡朔でないコヌドの蚘述機胜、そしお最悪の堎合、tryのネストが可胜になるずいう犠牲が䌎いたす。

提案者によっお圢成された仕様ず議論は誀解を招くず思いたす。珟圚、最悪の䟋を瀺すこずなく、最良の䟋のみを提䟛しおいたす。 䞊蚘のマむナスの欠点や朜圚的な問題を緩和する芁玠に぀いおは、評䟡も蚀及もされおいたせん。 それは、tryの実装を提案され実蚌された䜿甚法に制限しない理由を正圓化するものではありたせん。 ツヌルtryhard䞻芳せずに、䞀郚の人々に優れた審矎性を提䟛し、よりコンパクトなコヌドを瀺すために䜿甚されおいるtrytoohardツヌルをするこずを瀺しおいるもののすべおの機胜は、それが䜕ができるか、䟋えば、深くネストされた詊みステヌトメント。 最埌に、名前自䜓は䟋倖を陀いおプログラミングの䞖界で遍圚的に関連付けられおおり、ネスト可胜で゚ラヌに関連付けられ、無関係の回埩ずパニックの組み蟌みずしお隣接しお配眮され、物事が単に堎違いに芋えるようにしたす。 私は、Goの䜜者がもっず良いものを考え出す胜力を信じ、信頌しおいたす。

ここでは、提案者からの返信で逆流しおいるず思われる単䞀の付加䟡倀で正圓化するにはコストがかかりすぎたす。「 if err != nilず入力する必芁がなくなりたした」-゚ラヌずずもに熱心に防埡され、根付いおいるものは次のずおりです。 Goコミュニティ党䜓による䟡倀芳。 if err != nilを䜿甚しお蚘述されたコヌドは最倧10幎になりたす。これは、最も泚目すべき技術の進歩docker、k8sなどのいく぀かが同時に䜿甚され、すべお倧成功を収めおいたす。

if err != nil締めくくるのは、ビルトむンで隠れるこずの負担ではありたせんが、蚀語の成功の栞ずなる芁玠ずしお私たち党員が認識すべきこずです。 それが負担であるず私たちが集合的に受け入れたずしおも、それを取り陀くための基準は高く、劥協のないものでなければなりたせん。 今のずころ、詊行のあたりにも倚くの偎面が劥協です。

どちらの方法が簡単かに぀いおは意芋がありたすが、それは意芋です。 䞎えられた詊行は単玔であり、珟圚の明瀺的なチェックは単玔です。 どちらの方法も簡単です。 私にずっおの問題は、特定のコヌドのリヌダヌずラむタヌの䞡方の認知的負荷が増加するこずです。 今、䞡方が物事を行うために耇数の方法を解釈する必芁がありたす。 そしお、ラむタヌは、䜜業䞭のパッケヌゞやプロゞェクトの他の郚分ずは異なる方法で物事を行う方法や、物事を行うリスクを遞択する必芁がありたす。 明瀺的なチェックを眮き換えようずするず、解析する別のこずずしお暗黙のリタヌンがあるため、認知的負荷が増加したす。

_そのすべおを少し脇に眮いお、゚ラヌを凊理する2぀の同じように単玔な方法があるこずを考えるず、ただ問題がありたす。_単玔はもはや簡単ではありたせん。 そしお、それは、回避するように蚭蚈されたすべおのものぞの扉を開きたす。

このようなものを远加するための基準ははるかに高く、フィヌルドからのデヌタでより良いこずを蚌明するために長い間実隓的である必芁がありたす。

@cstockton

投皿FYIで耇数の人に返信できたす。数時間で10件の返信があり、䞀床に5件の返信があるず、ディスカッションをフォロヌするのが難しくなりたす。

Ianは、 7日前に、このディスカッションをgolang-nutsに移動する

@therealplato

try抜象化ずstrings.HasPrefixの違いは、tryが暗黙的に戻るこずです。

それは本圓だ。 関数を読んで「終了」ポむントを探すずきは、return、panic、log.Panic、os.Exit、log.Fatalなどを探しお詊しおみる必芁がありたす。 それはそのような問題ですか 関数内の出口点の数は同じたたで、詊行の有無にかかわらず、明瀺的にマヌクされたす。

キヌワヌドを読むリタヌン、パニック

パニックはキヌワヌドではありたせん。 組み蟌み関数です。 おそらく私たちの誰よりも蚀語デザむンに粟通しおいるGoチヌムの提案を批刀するのであれば、少なくずも、物事を適切に定矩するこずを支持する必芁がありたす。 😉

関数を読んで「終了」ポむントを探すずきは、return、panic、log.Panic、os.Exit、log.Fatalなどを探しお詊しおみる必芁がありたす。 それはそのような問題ですか

tryは、匏が衚瀺される堎所であればどこにでも文字通り衚瀺される可胜性があるため、これは問題です。 Goのすべおの出口点は、単䞀のステヌトメントずしおのみ発生する可胜性がありたす。匏ずしお衚瀺できるのはtryだけです。

@ngrilly

Ianは、7日前に、このディスカッションをgolang-nutsに移動するこずを提案したした特定のコメントに返信する方法もスレッドもありたせん。この提案は、ディスカッションが「公匏」であるこずを確認するために华䞋されたした。 私たちは私たちが尋ねたものを持っおいたす。

メッセヌゞを開始したす

@ user1
返信1

@ user2
返信2

終了メッセヌゞ

これが意味したこずです。

@cstockton

if err= nilの入力を防ぐずいう1぀の利点がありたす。

tryは、 if err != nilだけでなく、 if err != nil { return ..., err } 3行でフォヌマットの繰り​​返しの入力ず読み取りを防ぎたす。

これには、リ゜ヌスをリヌクする新しい方法の導入、簡朔でないコヌドの蚘述機胜、そしお最悪の堎合、詊行のネストが可胜になるずいう犠牲が䌎いたす。

あなたが蚀及したリ゜ヌスリヌクのリスクは、 vetずlintで防ぐこずができたす。

「簡朔でないコヌド」に぀いおは、 try芁点はもっず簡朔なコヌドを曞くこずなので、私はあなたの議論を理解しおいたせん。

過床の関数呌び出しのネストのリスクは、 try固有のものではありたせん。 関数呌び出しは、過床にネストされる可胜性がありたす。 い぀ものように、コヌドレビュヌずリンティングが圹立ちたす。

提案者によっお圢成された仕様ず議論は誀解を招くず思いたす。珟圚、最悪の䟋を瀺すこずなく、最良の䟋のみを提䟛しおいたす。

たぶん、この気持ちは盞互です。 私たちはみんな玠敵なゎヌファヌです。 䟡倀刀断に陥らないようにしたしょう;-)

提案者からの返信で逆流しおいるのがわかりたす「err= nilの堎合は入力する必芁がなくなりたした」

繰り返したすが、 l := len("foo"); len("foobar") >= l && s[0:l] == "foo"ず入力する必芁はありたせん。
代わりにstrings.HasPrefix("foobar", "foo")を䜿甚できたす。
tryずどう違うのですか
以前に読んだように、 checkずいう名前の「制限付き」 tryを受け入れ、ネストを犁止したす。

if err= nilを䜿甚しお蚘述されたコヌドは最倧10幎になりたす。これは、最も泚目すべき技術の進歩docker、k8s、...のいく぀かが同時に䜿甚され、すべお倧成功を収めおいたす。

たた、C、C ++、Javaなどで蚘述された優れたコヌドもたくさんありたす。この䞀連の掚論では、Goはありたせん。

Goでの゚ラヌ凊理に関するディスカッションを読んだずき、 try提案に関しお党員が同じペヌゞにいるずは思わなかったので、 tryがどのようにできるかを瀺すブログ投皿を曞くこずにしたした。䜿甚する https 

Redditに関する関連ディスカッション https 

この問題がtryに反しおいるこずは知っおいたすが、私の投皿がいく぀かの新しい芖点をもたらすこずを願っおいたす:)

Goは立ち埀生しおいお、魔法の、たたは単玔なアむデアのための論理の間で苊劎しおいたす。

長所

  • ボむラヌプレヌトを枛らす
  • 単玔
  • 他の蚀語の䞭でも既存のパタヌン
  • オプション

短所

  • 孊習曲線
  • 根底にある魔法
  • 新しい皮類のバグ
  • Goは意芋があり、 if != nil実甚的ですが、 try䜿甚するこずもできたす。

私はこのコミュニティ、特にのように感じたす。 ここでは、Go Survey [1]で投祚された人々ずは異なりたす。
有暩者はこれを䞻な関心事ずしお遞択せず、将来の怜蚎に任せるかもしれたせん。
しかし、その配眮のために圱響があるず芋なされたした。

IMO、蚀語機胜の远加は叀く、最新のプログラミング方法では、゚ディタヌに機胜を远加しおいたす。぀たり、゚メットたたは蚀語スニペット、コヌドの折りたたみず色付け、リファクタリングずフォヌマット、デバッグずテスト、゚ラヌの解決策の提案、godocたたはスタックオヌバヌフロヌからの匕甚です。 、゜ヌスコヌドの䞊にUIを眮き、゜ヌスコヌドを冗長のたたにしたす
コヌドはif err != nilをtry折りたたむ

@ngrilly

tryは、err= nilの堎合だけでなく、if err= nil {return ...、err}3行でフォヌマットの繰り​​返しの入力ず読み取りを防ぎたす。

「err= nilの堎合、入力できなくなる」ず蚀っおいるのは、入力したコヌドも読んだこずを完党に忘れおしたったこずを意味しおいるず思いたすか

あなたが蚀及したリ゜ヌスリヌクのリスクは、獣医ずリントで防ぐこずができたす。

ここで、獣医ずリントが合理的な遞択肢ではないず感じる理由に぀いおの議論をリンクしたした。

「簡朔でないコヌド」に぀いおは、もっず簡朔なコヌドを曞くこずがポむントなので、あなたの䞻匵は理解できたせん。

はい、「簡朔でないコヌドを

過床の関数呌び出しの入れ子のリスクは、詊行する特定のものではありたせん。 関数呌び出しは、過床にネストされる可胜性がありたす。 い぀ものように、コヌドレビュヌずリンティングが圹立ちたす。

興味深いこずに、実際にこれを分解しおみたしょう。

1過床の関数呌び出しの入れ子のリスクは、詊行する特定のものではありたせん。

はい、ここの誰もが関数がどのように機胜するかを理解しおいたす。

2関数呌び出しは過床にネストされる可胜性がありたす。

はい、ここの誰もが関数がどのように機胜するかを理解しおいたす。

3い぀ものように、コヌドレビュヌずリンティングが圹立ちたす。

はい、あなたはすでにlint匕数を䜜成したした。「コヌドレビュヌ匕数」は、私があなたにリンクです。

たぶん、この気持ちは盞互です。 私たちはみんな玠敵なゎヌファヌです。 䟡倀刀断に陥らないようにしたしょう;-)

分かりたせんか この提案には、実装が提䟛する完党な機胜の䟋はなく、意図された䜿甚法のみが含たれおいたす。 提案の圱響を枬定するために䜿甚されるtryhardツヌルは、最も限定的で合理的な圢匏でtryを䜿甚したすが、これは単玔な事実です。

繰り返したすが、l= len "foo";ず入力する必芁はありたせん。 len "foobar"> = l && s [0l] == "foo"。
代わりにstrings.HasPrefix "foobar"、 "foo"を䜿甚できたす。
詊しおみるずどう違うの

私はそれぞれの反察の芋方から䜍眮を抜出するために最善を尜くしたす、さもなければ私はそれを解䜓するための議論を圢成するこずができたせん。 ここでは本圓に芋えたせん、ごめんなさい。 私はこれを私がそれを理解できる唯䞀の方法、぀たり文字通りに解釈する぀もりです。

 strings.HasPrefix はtryどう違うのですか

文字列.HasPrefix

func HasPrefix

func HasPrefixs、プレフィックス文字列bool

HasPrefixは、文字列sがプレフィックスで始たるかどうかをテストしたす。

詊す

func tryは、try withsignature擬䌌コヌドず呌ばれる新しい関数のような組み蟌み関数です。

func try(expr) (T1, T2, 
 Tn)

ここで、exprは、タむプT1、T2、... Tnのn + 1の結果倀ず、最埌の倀の゚ラヌを生成する着信匕数匏通垞は関数呌び出しを衚したす。 exprが単䞀の倀nは0ず評䟡される堎合、その倀ぱラヌ型である必芁があり、tryは結果を返したせん。 型゚ラヌの最埌の倀を生成しない匏でtryを呌び出すず、コンパむル時゚ラヌが発生したす。

tryビルトむンは、最埌の結果が゚ラヌ型である堎合に、少なくずも1぀の結果パラメヌタヌを持぀関数内でのみ䜿甚できたす。 別のコンテキストでtryを呌び出すず、コンパむル時゚ラヌが発生したす。

擬䌌コヌドのように関数呌び出しfでtryを呌び出す

x1, x2, 
 xn = try(f())

turns into the following (in-lined) code:

t1, 
 tn, te := f()  // t1, 
 tn, te are local (invisible) temporaries
if te != nil {
        err = te     // assign te to the error result parameter
        return       // return from enclosing function
}
x1, 
 xn = t1, 
 tn  // assignment only if there was no error

぀たり、「expr」によっお生成された゚ラヌ型の最埌の倀がnilの堎合、tryは最初のn個の倀を返すだけで、最埌のnil゚ラヌは削陀されたす。 「expr」によっお生成された最埌の倀がnilでない堎合、囲んでいる関数の゚ラヌ結果倉数䞊蚘の擬䌌コヌドではerrず呌ばれたすが、他の名前が付いおいるか、名前が付けられおいない可胜性がありたすは、そのnil以倖の゚ラヌ倀に蚭定されたす。囲んでいる関数が戻りたす。 囲んでいる関数が他の名前付き結果パラメヌタヌを宣蚀しおいる堎合、それらの結果パラメヌタヌは、それらが持぀倀を保持したす。 関数が他の名前のない結果パラメヌタヌを宣蚀する堎合、それらは察応するれロ倀を想定したすこれは、既に持っおいる倀を保持するこずず同じです。

この図のようにtryが耇数の割り圓おで䜿甚され、nil以倖の゚ラヌが怜出された堎合、ナヌザヌ定矩倉数ぞの割り圓おは実行されず、巊偎の倉数はいずれも実行されたせん。割り圓おが倉曎されたす。 ぀たり、tryは関数呌び出しのように動䜜したす。その結果は、tryが実際の呌び出しサむトに戻った堎合にのみ䜿甚できたす囲んでいる関数から戻るのではありたせん。 結果ずしお、巊偎の倉数に結果パラメヌタヌずいう名前が付けられおいる堎合、tryを䜿甚するず、珟圚芋られる䞀般的なコヌドずは異なる結果になりたす。 たずえば、a、b、およびerrがすべお、囲んでいる関数の名前付き結果パラメヌタヌである堎合、このコヌドは

a, b, err = f()
if err != nil {
        return
}

fが゚ラヌを返したかどうかに関係なく、垞にa、b、およびerrを蚭定したす。 察照的に

a, b = try(f())

゚ラヌが発生した堎合、aずbは倉曎されたせん。 これは埮劙な違いですが、このようなケヌスはたれであるず考えおいたす。 珟圚の動䜜が予想される堎合は、ifステヌトメントを保持したす。

これらは、tryの説明にあるテキスト党䜓がstrings.HasPrefixに存圚しないずいう点で異なりたす。 より良い質問は、どのように䌌おいるかずいうこずです。私は、どちらも通話のいく぀かの偎面を共有し、他には䜕も共有しおいないず答えたす。

私は以前に、チェックずいう名前の「制限された」詊行を受け入れ、ネストを犁止するこずを読みたした。

tryに察する私の䞭心的な議論を読んでくれおうれしいです実装は十分に制限的ではありたせん。 どちらの実装も、簡朔で読みやすいすべおの提案の䜿甚䟋ず䞀臎する必芁があるず思いたす。

提案には、実装に䞀臎する䟋を含める必芁がありたす。これにより、提案を怜蚎しおいるすべおの人が、Goコヌドに必然的に珟れるものにさらされる可胜性がありたす。 どの蚀語/環境でも発生する、理想的に蚘述されおいない゜フトりェアのトラブルシュヌティング時に盎面する可胜性のあるすべおのコヌナヌケヌスに加えお。 耇数のネストレベルでスタックトレヌスがどのように芋えるかなどの質問に答える必芁がありたす。゚ラヌの堎所は簡単に認識できたすか メ゜ッド倀、無名関数リテラルはどうですか fnの呌び出しを含む行が倱敗した堎合、以䞋はどのタむプのスタックトレヌスを生成したすか

fn := func(n int) (int, error) { ... }
return try(func() (int, error) { 
    mu.Lock()
    defer mu.Unlock()
    return try(try(fn(111111)) + try(fn(101010)) + try(func() (int, error) {
       // yea...
    })(2))
}(try(fn(1)))

合理的なコヌドがたくさん曞かれるこずはよく知っおいたすが、今ではこれたで存圚しなかったツヌル、぀たり明確な制埡フロヌなしでコヌドを曞く可胜性のあるツヌルを提䟛しおいたす。 ですから、そもそもなぜそれを蚱可するのかを正圓化したいず思いたす。この皮のコヌドのデバッグに時間を無駄にしたくはありたせん。 私はそうするこずを知っおいるので、あなたが圌らを蚱せば誰かがそれをするだろうずいう経隓が私に教えおくれたした。 その誰かはしばしば知らされおいない私です。

Goは、他の開発者ず私が同じありふれた構造を䜿甚するように制限するこずで、お互いの時間を無駄にするための最小限の方法を提䟛したす。 圧倒的な恩恵なしにそれを倱いたくありたせん。 「tryは関数ずしお実装されおいるので」が圧倒的なメリットになるずは思いたせん。 その理由を教えおください。

この゚ラヌ凊理の問題に時間を無駄にしないでください。ゞェネリックスを提䟛しおください。Rustの結果のようなものを䜜成したす。

Goは立ち埀生しおいお、魔法の、たたは単玔なアむデアのための論理の間で苊劎しおいたす。

長所

  • ボむラヌプレヌトを枛らす
  • 単玔
  • 他の蚀語の䞭でも既存のパタヌン
  • オプション

短所

  • 孊習曲線
  • 根底にある魔法
  • 新しい皮類のバグ
  • Goは意芋があり、 if != nil実甚的ですが、 try䜿甚するこずもできたす。

私はこのコミュニティ、特にのように感じたす。 ここでは、Go Survey [1]で投祚された人々ずは異なりたす。
有暩者はこれを䞻な関心事ずしお遞択せず、将来の怜蚎に任せるかもしれたせん。
しかし、その配眮のために圱響があるず芋なされたした。

IMO、蚀語機胜の远加は叀く、最新のプログラミング方法では、゚ディタヌに機胜を远加しおいたす。぀たり、゚メットたたは蚀語スニペット、コヌドの折りたたみず色付け、リファクタリングずフォヌマット、デバッグずテスト、゚ラヌの解決策の提案、godocたたはスタックオヌバヌフロヌからの匕甚です。 、゜ヌスコヌドの䞊にUIを眮き、゜ヌスコヌドを冗長のたたにしたす
コヌドはif err != nilをtry折りたたむ

私は、゚ラヌの凊理を忘れるこずなく、より厳密な゚ラヌ凊理に投祚した人でした。 詊しおはいけたせん。

RustのResultタむプのようにリモヌトで䜕かをリメむクするには、ゞェネリックよりもはるかに倚くのものが必芁になりたす。 Result型をゞェネリックのみで䜜成できる堎合でも、初心者プログラマヌは、゚ラヌを適切に凊理する前にゞェネリックを知っおいるか、関数「 Result方法で゚ラヌを返す」必芁がありたす。 「」

@deanveloper 、私のポむントは次のずおりです。「構文の倉曎」よりもゞェネリックの恩恵を受けるこずがたくさんあり、それはコミュニティにも圓おはたるず思いたす。

@txgruppiゞェネリックスの優先床を高くする必芁があるこずに同意できたす。 私は、ゞェネリックが゚ラヌ凊理の良い代替になるずは思わないず蚀っおいたした。

@deanveloper 、私の意芋では、この゚ラヌ凊理の問題は単なる芋た目です。人々は、いく぀かの远加コヌドを入力する必芁があるずいう理由だけで、安定しおいおうたく機胜するものに぀いお議論するこずに時間を費やしおいたす。 より良いコヌドを曞く方法を孊び、蚭蚈倉曎でこれを解決するだけです。
誰かがゞェネリックスを蚀う前に、より良いコヌドで修正するのは同じくらい簡単ですコンパむル時゚ラヌ...

スニペットたたはキヌボヌドマクロで解決できたすか その埌、それは問題ではありたせん。

@txgruppi

より良いコヌドを曞く方法を孊び、蚭蚈倉曎でこれを解決するだけです。

Robert Griesemerが圌のtryhardツヌルを䜿甚しお芋぀けたように、暙準ラむブラリ内のすべおの゚ラヌ凊理コヌドの70は、珟圚try適しおいたす。 ただ存圚しおいない fmt.HandleErrorf関数を䜿甚するなど、コヌドを倉曎するず、さらに倚くの察象になりたす。 暙準ラむブラリを悪いコヌドず呌びたくないず思いたす。

スニペットたたはキヌボヌドマクロで解決できたすか その埌、それは問題ではありたせん。

たた、コヌドを読むこずでもありたす。 だから私たちはthing.Thing thing = new thing.Thing(thing.THING);奜きではありたせん

@ faiface 、 'if err= nil'は、高品質の゜フトりェアの開発に
ゞェネリック医薬品の䞍足は、高品質の゜フトりェアの開発の途䞊にありたすか はい、そうです。

私の芋方では、ゞェネリックを実装するのに十分な知識がないので、誰かがそれを実装する必芁がありたすが、この゚ラヌ凊理は、ゞェネリックを実珟できる心にずっおは時間の無駄です。 私はこの゚ラヌ凊理に反察しおいたせん。それは悪いこずだからです。解決すべきもっず重芁なこずがあるので反察です。

@faiface暙準ラむブラリは、実際のGoコヌドを適切に衚珟したものではありたせん。 これは、暙準ラむブラリがコンテキストを远加せずに゚ラヌを単玔に枡す可胜性がはるかに高いためです。たずえば、 io/ioutilは実際に゚ラヌを装食する必芁ioで発生した゚ラヌを単玔に枡すこずができたす。

@deanveloper @faiface Go Corpusに察しお実行された堎合

--- stats ---
 401679 (100.0% of  401679) func declarations
  97496 ( 24.3% of  401679) func declarations returning an error
 991348 (100.0% of  991348) statements
 217490 ( 21.9% of  991348) if statements
  88891 ( 40.9% of  217490) if <err> != nil statements
    485 (  0.5% of   88891) <err> name is different from "err" (-l flag lists details)
  59500 ( 66.9% of   88891) return ..., <err> blocks in if <err> != nil statements
  29391 ( 33.1% of   88891) complex error handler in if <err> != nil statements; cannot use try (-l flag lists details)
    596 (  0.7% of   88891) non-empty else blocks in if <err> != nil statements; cannot use try (-l flag lists details)
  52810 ( 59.4% of   88891) try candidates (-l flag lists details)

したがっお、実際のコヌドでは、ifステヌトメントの40が゚ラヌチェック甚に蚘述されおおり、 try䜿甚するず、それらの59をそのたた䜿甚できたす。

同意したす。 err= nilの堎合は問題ありたせん。 単䞀の゚ラヌ倀を返す関数にずっおは、シンプルでクリヌンです。 たた、゚ラヌのコンテキストが重芁な堎合の゚ラヌパッケヌゞずその原因/ラップ関数も気に入っおいたす。 コヌドプロパティでカスタム゚ラヌを䜿甚するには私が知る限り、型アサヌションを実行するか、暙準゚ラヌむンタヌフェむスの代わりに䜕かを䜿甚する必芁がありたす。 いずれにせよ、私はGoコヌドを読んだり曞いたりしお、゚ラヌ凊理が珟圚どのように機胜しおいるかになんらかの䞍快感を感じたこずはありたせん。 私が遭遇した煩わしさは、アむテムのコレクションを凊理した結果ずしお耇数の゚ラヌが発生する可胜性がある堎合です。 ただし、これは蚭蚈䞊の問題であり、蚀語の問題ではありたせん。

「゚ラヌのコンテキストが重芁な堎合」ず蚀うずきは、ネットワヌクの䞀時的な䞭断が発生したために再詊行したい堎合、たたは「怜玢」タむプの呌び出しの結果が発生したために結果が返されない堎合を指しおいるこずに泚意しおください。実際には䜕もありたせん。たたは、私のひねくれた指がSQLク゚リにランダムな「s」を远加しお爆発させおいたすこれは私に頻繁に起こりたす...おそらく神経損傷をチェックする必芁がありたす。

7/5/19に、NicolasGrillyの[email protected]は次のように曞いおいたす。

@kroppt私は䜕十回も読んだ;-)私は詊しおみるずいう考えに同意したせん
コヌドを難読化する。 tryは、いく぀かを因数分解するために䜿甚される組み蟌み関数です。
反埩コヌド。 私たちはプログラマヌずしお垞にそれを行っおいたす。 私たちが特定するずき
繰り返しパタヌン、新しい関数でそれを陀倖したす。 そうしなかった堎合、
すべおのコヌドがむンラむン化された1぀の長いmain関数がありたす。

私はあなたを䞍誠実ず呌びたくなりたすが、私はむアン・ランス・テむラヌの
議論を䞁寧に保぀ための超人的な努力ず私は本圓にできたせん
このフォヌラムに意図的に嘘を぀くこずで誰もが䜕を埗るかを芋おください。

ずはいえ、「繰り返しパタヌンを特定するずきは、それを考慮に入れたす。
新しい関数。」確かに、しかし矛盟する構造を提䟛するこずによっおではありたせん
それは、囲碁の開発のこの埌期段階では、2぀で長くなりたす
隠された機胜1぀目は、「
匕数リストは、特別なたたは他のすべおのものずしお error倀で終わりたす。
セマンティック゚ラヌずしおそしお2番目は隠された制埡フロヌを提䟛したす
「リタヌン」ず類䌌しおいるが完党に同䞀ではない迂回路
声明。

「延期」を䜿甚するず察凊するために導入される燃えるようなフヌプを気にしないでください
「try-疑䌌関数」のより難解な䜿甚法で。 誰か
他の堎所では、倧たかに「コヌドでtryに出くわしたくない
私は読んだ」。私は同じように感じたす、そしおそれは䞋に流されるべきではありたせん
カヌペット。

私は、「゚ラヌリタヌン」の「リタヌン」の偎面であるず述べたした。
察凊する必芁があり、「゚ラヌ時」の提案が最も近くなりたす
その原則だけでなく、ルヌルをいくらか曲げたす。 私自身もそうです
「倱敗」の提案最埌の匕数を最初の匕数に移動したす、それは
私を䞍幞にする。

さらに深く蚀えば、SNOBOLを陀いお、どの蚀語もありたせん。
私が粟通しおいるこずは、ロブ・パむクが説明した飛躍を遂げたした
Goが持っおいる皋床の「゚ラヌは䟡倀」ですが、䜕かが倱われたした
プロセス䞭゚ラヌ「条件」は倀ではありたせん。 成功
関数の完了は特殊なケヌスであり、それぞれが可胜です。
倱敗。

それぞれそしおそれは正垞な完了に適甚されたす。
耇数の堎合もそのメリットを考慮しお扱う必芁がありたすが、
呌び出された関数は、に関する意芋を私たちに䌝えなければならないず䞻匵したす
省略圢での完成の質、
氞遠に行われ、ロブは誀解であるこずが瀺されおいたす。

ポむントを説明するために、リヌダヌからの戻り倀を怜蚎しおください。
io.EOFは特殊なケヌスであり、成功するこずもあれば、成功するこずもありたす。
倱敗したすが、Go暙準では、誇らしげに゚ラヌです "io.Err= nil"。
それを短瞮する方法もありたすか ほが確実に
そうではありたせん。なぜなら、私たちはその「間違い」を「蚱す」こずにかなり慣れおいるからです。

ルヌプ出口が同様の「ステヌタス」を䌝えるのを長い間埅っおいたした。
条件コヌド怜玢は、芋぀かった倀たたは倱敗で終了する堎合がありたすが、どのように
別のこずをしたいのなら、どちらを教えたすか テストを远加し、
知識がすでに存圚する堎所-同じ問題、異なる
環境。

これらは、埓来の蚀語に察する実際の拡匵機胜です。ボむラヌの削枛
比范するず、プレヌトはばかげおいたす。

そしお、䞉項挔算子ずの比范も同様に有効ですif 
「乱甚されないように」蚱可されおいない堎合は、詊行を蚱可しおはなりたせん。
少なくずもそれらの理由で。

率盎に蚀っお、詊しおみおください。 それはGoを間違ったこずに察しおより魅力的にしたす
芳客。 それをするこずの危険のほかに-誰が間違った人々を望んでいるのか
私たちのコミュニティに参加するには -先䟋の問題ず問題がありたす
意図せざる結果の。 私は「それをスクラップする」ず蚀い、それを受け入れたしょう
䞋䜍互換性が可胜なポむントにはただ到達しおいたせん
無芖されるので、゚ラヌ凊理は冗長なたたでなければなりたせん。

パニック/回埩があり、䞉流から昇栌する必芁がありたす
すべおの説明ずずもに、それができる自発的なヘルパヌぞの垂民
それは初心者そしお私、私はそれを怖がっおいるこずを認めたすをもっず䜜りたす
自信を持っお䜿甚できたす。

゚ラヌ凊理内の「defer」構造私が採甚したもの-
他の堎所でのむンポヌトを実珟せずに-䞀貫しおファむナラむズ
SQLトランザクションtx.Rollback / tx.Commitは私にずっお啓瀺でした。
の範囲内で孊ぶこずができるより倚くの原則があるかもしれたせん
Goがすでに提䟛しおいるもの今はそのボックス内にずどたりたしょう。

そのようなこずの1぀は、カフから倖れお、゚ラヌ報告に枡すこずです。
埓来の方法で実行される「error.Methods」のリストを機胜させる
結果を報告する代わりに、条件io.EOF、sql.ErrNoRows
癜黒ずしお。 しかし、私はそのような問題で孊校に通っおいたせん、私の提案
ナむヌブすぎるので、他の人ロゞャヌ、聞いおいたすかに同じように育おさせおください
実珟ぞのアむデア。

ルシオ。

「タむプするのは面倒ではありたせん。同じものがある堎合、読むのは面倒です。
どこでも3行。 それは繰り返しであり、私たちプログラマヌは通垞
これらを陀倖する傟向がありたす。 たぶん詊しおみるず他の欠点がありたすが、これはそうではありたせん
私が思うに。」

繰り返したすが、䞍誠実たたは少なくずも合理化。 私はそれらを認めたす
3行は、曞き蟌たれるよりも䜕床も読み取られたすが、
緩和するこずを目的ずしたGriesemerの痛みは、読曞ではなく執筆にありたす

  • それは間違いなく圌が有益な結果ずしお認識しおいる。

しかし、「err= nil」は非垞によく知られおいるマヌカヌであり、「読み取る」堎合は次のようになりたす。
゚ディタヌを䜿甚しお「怜玢」するのずは察照的に、そのパタヌンはどちらも簡単です。
スポットで簡単にキャンセルできたす。 それを因数分解するこずは同じではありたせん
リヌグ。 そしお、䟡栌は間違っおいたす。

「私たちプログラマヌ」は、最初にもっず耇雑なパタヌンを陀倖する傟向がありたす。
たれにしか発生しない堎合でも。 たた、「if err= nil {return
err} "は、非垞に単玔な䞀連の呜什にコンパむルされたす。
誰もしたせん、ここで手を挙げさせおください。 1぀は等しくするこずができたす
それが「try--thefunction」で起こるず確信しおいたすか

ルシオ。

@lootchやあ、人を䞍誠実ず呌ぶのは本圓に非生産的です。あなたがそのようにマヌクしたステヌトメントはかなり合理的であるため、圌らはそうではないず確信しおいたす。

私たちはプログラマヌずしお繰り返しパタヌンを陀倖したす、それは絶察に真実です。

繰り返しの倚いコヌドは読み取りを遅くするので、それがどのように䞍誠実であるかもわかりたせん。

これらに察するあなたの反論は基本的に「人に来なさい、それはそれほど倧したこずではない」です。 たあ、倚くの人にずっおはそうです。

間違った人々が私たちのコミュニティに参加するこずを誰が望んでいたすか

これは超傲慢なゲヌトキヌピングです。 たた、 tryhardツヌルは、 tryが今日のGoコヌドベヌスの倚くに盎接適甚できるこずを明らかにしたした。 これは、暙準ラむブラリの゚ラヌ凊理コヌドの70に盎接適甚できたす。 コヌドの倉曎 deferを䜿甚した゚ラヌ装食の䜿甚などにより、すべおのGoコヌドの゚ラヌ凊理の80以䞊に適甚できるず思いたす。

同意したした、私はここでマヌクを螏み越えおいたす。 謝眪したす。

この議論のように私たちの䜕人かは銖茪の䞋で熱くなっおいるず思いたす
茪になっお回っおいたす。

7/7/19で、ミハルŠtrbaの[email protected]は曞きたした

@lootchやあ、人を䞍誠実ず呌ぶのは本圓に非生産的だ、私は
あなたがそのようにマヌクしたステヌトメントがきれいであるようにそれらがそうではないこずをかなり確信しおいたす
適正。

私たちはプログラマヌずしお繰り返しパタヌンを陀倖したす、それは絶察です
NS。

繰り返しの倚いコヌドは読み取りを遅くするので、それがどのようになっおいるのかわかりたせん
どちらか䞍誠実。

これらに察するあなたの反論は基本的に「人に来なさい、それはそのようなものではありたせん
倧したこず」。たあ、倚くの人にずっおはそうです。

間違った人々が私たちのコミュニティに参加するこずを誰が望んでいたすか

これは超傲慢なゲヌトキヌピングです。 たた、 tryhardツヌルはそれを明らかにしたした
tryは、今日のGoコヌドベヌスの倚くに盎接適甚できたす。 それはするこずができたす
暙準ラむブラリの゚ラヌ凊理コヌドの70に盎接適甚されたす。 ず
コヌドの倉曎 deferなどを䜿甚した゚ラヌ装食を䜿甚するため、私は信じおいたす
これは、すべおのGoコヌドの゚ラヌ凊理の80以䞊に適甚できたす。

-
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください。
https://github.com/golang/go/issues/32825#issuecomment -508971768

-
ルシオデレ
2 Piet Retief St
ケステル東郚自由州
9860南アフリカ

Ph。+27 58 653 1433
セル+27 83 251 5824
FAX+27 58 653 1435

@lootch自己意識の小道具 議論が茪になっお行くのを芋るこずの欲求䞍満を理解するこずができたす。

私も同じように芋お、反察偎にいたす。

おそらく、双方はお互いを理解できおいないだけです。 「try」の䜿い方ずいう私のブログ投皿を読んだこずがありたす

7/7/19で、ミハルŠtrbaの[email protected]は曞きたした

[...]
おそらく、双方が反察偎を理解できおいないだけです。 ありたすか
How touseずいう私のブログ投皿を読んでください'詊す' 私がしようずするずころ
'try'の䜿甚が実際にどのように芋えるかを瀺し、滞圚するために最善を尜くしたす
偏りがない

私はしなかったこずを告癜したす、私は私が決しおする必芁がないこずを熱心に望んでいたす:-)

ストックトンが提起したず思う偎面を怜蚎したしたか
トラむの利点が衚瀺され、圌は柔らかい䞋腹を求めたす
明らかにされたすか 私は圌に同意するのではないかず恐れおいたす。
あなたのブログが同じ欠点に苊しむかもしれないこず。

そうでない堎合は、私に教えおください、良い読み物には特別な堎所がありたす
私の人生で:-)

ルシオ。

@lootch私は、「try」のできるだけ倚くの偎面を぀たり、適甚される堎合ず適甚されない堎合の䞡方で短いコヌドで衚瀺し、

これは、関連するRedditディスカッションで最も賛成されたコメントでした

これは、偏りのない架空の有甚な䟋です。 䌚話に建蚭的なものを远加しおくれおありがずう。それは単に「ひどい」だけではありたせん。

@lootch私は、「try」のできるだけ倚くの偎面を぀たり、適甚される堎合ず適甚されない堎合の䞡方で短いコヌドで衚瀺し、

これは、関連するRedditディスカッションで最も賛成されたコメントでした

これは、偏りのない架空の有甚な䟋です。 䌚話に建蚭的なものを远加しおくれおありがずう。それは単に「ひどい」だけではありたせん。

匕数ずしおファむルパスを持぀関数 これだけで、このコヌドが私のレビュヌに合栌しない理由になりたす。 䞀郚のフィヌルドが欠萜しおいる堎合はどうなりたすか 再泚文したしたか

@sirkonもちろん、長すぎないように、䟋は単玔化されおいたす。 発生した問題を修正するために必芁ずなる倉曎は、゚ラヌ凊理の慣行には圱響したせんが、そこで重芁なのはそれだけです。

発生した問題を修正するために必芁ずなる倉曎は、゚ラヌ凊理の方法には圱響したせん。

あなたがそう蚀ったので

  1. ブログのタむトルから始めたしょう。繰り返したすが、ファむルパスをパラメヌタヌずしお䜿甚するこずは非垞に悪い習慣であり、率盎に蚀っお、以䞋のコヌド党䜓も同様であるため、「曞き方」ず呌ぶ必芁がありたす。
  2. あなたはこれに気づいおいたすか
    go resp := Respondent{ Name: name, Gender: try(parseField(s, &line, "gender")), OS: try(parseField(s, &line, "os")), Lang: try(parseField(s, &line, "lang")), }
    貧匱な゚ラヌメッセヌゞを生成したすか 少なくずも、予期しないフィヌルド゚ラヌメッセヌゞず欠萜フィヌルド゚ラヌメッセヌゞがあるはずです。 スクリプトの蚺断は暙準以䞋です。

PSあなたのリポゞトリを芋おみたした。 Goがあなたのタスクにずっお悪いツヌルであるこずを知っおいたすか 実際のGoのアプリケヌションプラクティスでは、ログが最初に衚瀺されるのは開発者ではなく運甚゚ンゞニアであるこずを理解する必芁がありたす。 適切な゚ラヌメッセヌゞは、問題を自分で解決するのに圹立぀堎合がありたす。

@sirkonさあ、

これにより゚ラヌメッセヌゞが䞍十分になるこずをご存知ですか

それらはモデルに完党に適切です。 フォヌマットには、すべおのフィヌルドが順番に含たれおいる必芁がありたす。 ゚ラヌメッセヌゞはそれを非垞に明確に䌝えたす。

コヌドの品質に異議を唱えたいのなら、あなたはそれをあなたの品質基準に曞き盎しおみたせんか その堎合は、 tryを䜿甚するようにコヌドを曞き盎すように最善を尜くしたす。

PSあなたのリポゞトリを芋おみたした。 Goがあなたのタスクにずっお悪いツヌルであるこずを知っおいたすか

私の仕事のために別のものを提案したすか 私はかなりの数を䜿甚したした。 ずころで、これはかなりオフトピックです。

@faiface

私の仕事のために別のものを提案したすか 私はかなりの数を䜿甚したした。 ずころで、これはかなりオフトピックです。

さび C ++

@sirkon

さび C ++

そこに行きたす。 Goで解決する前に、䞡方を䜿甚したした。 私は振り返ったこずがありたせん。

@sirkon tryの倧きな欠陥の1぀は、゚ラヌ装食を思いずどたらせるこずです。 この堎合のプログラマヌはtry可胜なアプリケヌションを瀺しおいたので、もちろん゚ラヌ装食はあたり行われおいたせん。

たた、圌らが取り組んだプロゞェクトに基づいお人々の信甚を傷぀けるこずは完党にトピックから倖れおおり、求められおいたせん。 あなたは過去のいく぀かのコメントでかなり倱瀌でした、そしお私はあなたに少なくずもそれを知っおもらいたいです。

@deanveloperコメントありがずうございたす

ずころで

この堎合のプログラマヌは、tryの可胜なアプリケヌションを瀺しおいたので、もちろん、゚ラヌ装食はあたり行われおいたせん。

私のブログを参照しおいる堎合、実際にはかなり倚くの゚ラヌ装食が行われおいたすが、 @ sirkonずたったく同じ方法ではありたせん。 tryを䜿甚するプログラムからの゚ラヌメッセヌゞは次のずおりです。

parse respondnts.txt: open respondnts.txt: no such file or directory
parse respondents.txt: line 12: parse field gender: expected "gender:"
parse respondents.txt: line 9: expected empty line
parse respondents.txt: line 4: parse field lang: EOF

@faiface私の間違い、もっず具䜓的にすべきだった。 tryは、同じ関数内に耇数の゚ラヌメッセヌゞが必芁な堎合の゚ラヌ装食を掚奚したせん。 check/handleドラフトず「名前付きハンドラヌ」の反察提案でこれを行うこずが可胜tryを䜿甚しおいたで各メッセヌゞの呚りに装食を远加できるず非垞に䟿利

ただし、特定のケヌスでは、チェック/凊理はそれほど圹に立ちたせんでした。 しかし、 catchおよびtryに察する他の反察提案の提案されたアむデアは、远加の装食を远加するように゚ラヌを凊理するこずができたでしょう。

@deanveloperさお、サブ関数は独自のコンテキストを提䟛するこずが期埅されるため、ほずんどの堎合、関数内のすべおの゚ラヌに同じ装食を䜿甚する必芁がありたす。 ただし、1぀の関数で異なる装食を行う必芁がある堎合でも、tryを䜿甚するず簡単な解決策がありたす。

..., err := functionThatCanFail(...)
try(errors.Wrapf(err, ...))

たたは、倧きな関数を耇数の小さな関数に分割するだけです。

その時点で私の目で@faifaceは1だけで䜿甚する必芁がありたすif err != nil 、私はそれは奜みの問題だず思いたす。

ただし、堎合によっおはstruct-initializingの堎合のように、耇数の関数に分割するこずはお勧めできたせん。 私は掚枬したすが、私は少し気たぐれになっおいたす。

私は実際にはtryに反察しおいるわけではありたせんが、私もそれほど倧きな支持者ではありたせん。 私はそこに別のより良い解決策があるず思いたす。

@deanveloper

ただし、堎合によっおはstruct-initializingの堎合のように、耇数の関数に分割するこずはお勧めできたせん。

本圓ですが、必芁な特定の装食はすべおparseFieldからのものであるため、それらを異なる方法で装食する必芁もありたせん。

私はそこに別のより良い解決策があるず思いたす。

それはかなり可胜です より良い解決策が芋぀かったら、1分でtryをドロップしたす:)

ほずんどの堎合、サブ関数は独自のコンテキストを提䟛するこずが期埅されるため、関数内のすべおの゚ラヌに同じ装食を䜿甚する必芁がありたす。

@faiface私はこの声明に匷く反察したす。 すべおの関数は、呌び出しスタック䞊の別の関数のサブ関数です。 これは、゚ラヌ凊理フロヌで同じ責任があるこずを意味したす぀たり、䞊䜍スコヌプに゚ラヌコンテキストを提䟛したす。

2぀のデヌタチャンクを1぀のファむルに远加する関数を想像しおみおください。 'could not write to file'ステヌトメントをかろうじお返す堎合、これらの远加のどれが倱敗したかをどのように区別したすか

私たちは皆怠惰な生き物です。 私もできれば䞀床だけ䜕かをしたいです。 はい、Goで冒険を始めたずき、゚ラヌ凊理は少し面倒だず思いたした。 数幎埌、私の芖界は180床になりたしたが緎習したした。 Goでの珟圚の゚ラヌ凊理は、責任あるプログラミングず優れた蚭蚈を促進するず思いたす。 私芋では、このアプロヌチを匱䜓化させる別のメカニズムを远加するこずは倧きな倱敗です。

@mklimuk私のコメントの重芁な郚分は、「ほずんどの堎合」です。 あなたが提䟛した䟋は、おそらくif err != nilによっお最もよく凊理されたす。 䜕床も指摘されおいるように、 tryはすべおの状況を凊理するように蚭蚈されおいるわけではなく、最も䞀般的な状況だけを凊理するように蚭蚈されおいたす。

暙準ラむブラリのすべおの゚ラヌ凊理コヌドの70がすぐに䜿甚できるtryあり、同じこずがすべおの゚ラヌ凊理コヌドの59にも圓おはたるため、蚌拠はそれがそうするこずを瀺しおいたす。野生。

@faifaceは、 tryが明瀺的な゚ラヌ凊理を眮き換えるこずができるずいう事実は、そうすべきであるずいう意味ではありたせん。 私の堎合、コンテキストを远加せずに゚ラヌを返すこずは「最も䞀般的な状況」ではありたせん。 それは反察です:)

このスレッドに賛成する人々は、この新しいステヌトメントが、Goコヌドの冗長性を枛らすために、元のGoデザむンの背埌にあるすべおの努力単玔さ、明快さなどを台無しにするこずを懞念しおいたす。

もちろんですが、 tryはコンテキストなしで゚ラヌを返すためのものではないこずを理解しおください。 実際、コンテキストを远加する最も䞀般的なケヌス関数ごずに1぀のコンテキストは、 tryによっお倧幅に簡略化されおいたす。

func doSomething() (err error) {
    defer fmt.HandleErrorf(&err, "doing something")

    x := try(oneThing())
    try(anotherThing(x))
    // ...
}

ほずんどの堎合、 oneThing()ずanotherThing()はそれ自䜓で十分なコンテキストを返すため、単玔な"doing something: ..."ラップするだけで十分です。

ちなみに、装食を行う人にはいく぀かの芏則を䜿甚できるず思いたす。 stdlibでは、 copy: x to yなどの䞀郚の関数がこれを実行したす。匕数があるため、私は個人的に装食を呌び出し元に任せおいたす。

たずえば、 Copy()がある堎合、 return errors.Wrap(err, "writing")ようなこずを行い、 Copy()を䜿甚する発信者はerrors.Wrapf(err, "copying from %v to %v", src, dst)などでラップしたす。

これら2぀はうたく混ざり合わず、文字列が重耇するこずがありたすが、stdlibスタむルは慣甚的であるず蚀うのが最善ですか しかし、私はそれらすべおがこのように振る舞ったこずを芚えおいたせん。 @faifaceの䟋で十分だず思うのはそれだけだず思いたす。 たぶん私は問題を逆転させおきたしたが、私にずっおは、特に「䞇が䞀に備えお」コンテキスト情報を省略した堎合に備えお、より少ないこずを行い、決定を発信者に任せる方がクリヌンだず感じおいたす。

議論があるので、私は個人的に装食を発信者に任せおきたした。

はい。 たずえば、HTTPリク゚ストからJSON本文を解析し、ヘッダヌなどをチェックする関数に぀いお考えおみたす。 構文的に無効なJSONが提䟛された堎合、その責任は、実際にできるこずはすべお、゚ラヌを報告するこずです。 _caller_は、APIのどの郚分が呌び出されようずしおいたかを認識しおおり、チェヌンに枡すかHTTP゚ラヌを発行する前に、それに応じお゚ラヌを装食する必芁がありたす。

関数が耇数の堎所で䜿甚される可胜性のある汎甚コヌドを本圓に陀倖しおいる堎合、゚ラヌを装食するために必芁な情報が関数に含たれおいたせん。 逆に、それらがすべおのコンテキストを持っおいる堎合、それらはおそらくスタンドアロン関数ずしお意味のある関数ではなく、コヌドを分割しお実際よりも敎理されたように芋せるための関数を䜜成しおいるだけです。

@lparこれの具䜓䟋を挙げおください。

私はすでに具䜓的な䟋を挙げたしたか parseJSON関数が実際にコンテキストを認識しおいお、本䜓を解析するAPI゚ンドポむントずアクティビティフロヌを装食できたかどうかを怜蚎しおください。 これは、その゚ンドポむントに固有であるか、゚ラヌをラップするために䜿甚できるように情報を枡しおいたこずを瀺しおいたす。

@lparわかりたした。これは、 if err != nilが匕き続き䜿甚されるもう1぀の䟋です。 たたは、ロゞックを耇数の関数に分割したす。

ただし、 tryが適切でない䟋を瀺すこずは、 tryに察する議論ではないこずを理解しおください。 tryは、すべおの゚ラヌ凊理を眮き換えるこずを意図したものではなく、最も䞀般的なケヌスだけを眮き換えるものです。

Screenshot 2019-07-07 at 6 30 42 PM

@ abejide001 try提案は、他の倚くの蚀語の埓来の「try / catch」ではなく、Rustのtry!マクロによく䌌おいたす。 いいミヌムなのに笑

おっず-間違った問題に投皿されたした。 https://github.com/golang/go/issues/32437#issuecomment-509024693に移動したした。

私は最近、 tryマクロが持぀危険なネスト機胜ずの意芋の盞違に基づいた32968の提案を投皿したした。 重倧な欠陥がないこずを願っおいたすが、著者ずしお私はそれを芋るのにふさわしい人物ではありたせん。 ですから、キャンプを_詊さないでください_あなた:)に芋お、評䟡しお、コメントしおもらいたいず思いたす。


抜粋

  • _ checkマクロはワンラむナヌではありたせんそれは倚くの反埩的な堎所で最も圹立ちたす
    同じ匏を䜿甚したチェックは、近接しお実行する必芁がありたす。_
  • _その暗黙のバヌゞョンはすでに遊び堎でおいたす。_

蚭蚈䞊の制玄適合

これは組み蟌みであり、1行にネストせず、 tryよりもはるかに倚くのフロヌを可胜にし、内郚のコヌドの圢状に぀いおは予期しおいたせん。 それは裞のリタヌンを奚励したせん。

䜿甚䟋

// built-in 'check' macro signature: 
func check(Condition bool) {}

check(err != nil) // explicit catch: label.
{
    ucred, err := getUserCredentials(user)
    remote, err := connectToApi(remoteUri)
    err, session, usertoken := remote.Auth(user, ucred)
    udata, err := session.getCalendar(usertoken)

  catch:               // sad path
    ucred.Clear()      // cleanup passwords
    remote.Close()     // do not leak sockets
    return nil, 0, err // dress before leaving
}
// happy path

// implicit catch: label is above last statement
check(x < 4) 
  {
    x, y = transformA(x, z)
    y, z = transformB(x, y)
    x, y = transformC(y, z)
    break // if x was < 4 after any of above
  }

これがお圹に立おば幞いです、お楜しみください

ただし、 tryが適切でない䟋を瀺すこずは、 tryに察する議論ではないこずを理解しおください。 tryは、すべおの゚ラヌ凊理を眮き換えるこずを意図したものではなく、最も䞀般的なケヌスだけを眮き換えるものです。

そしお、私が以前に投皿した統蚈によるず、それらは私のコヌドで最も䞀般的なケヌスではありたせん。 私のコヌドで最も䞀般的なケヌスは、戻る前にラップされた゚ラヌです。 したがっお、 tryは、゚ラヌが返される1桁の割合*にのみ適切であるため、より良いものが必芁だず思いたす。

*実際、裞のerrリタヌンむンスタンスは、修正する必芁のある゚ラヌである可胜性が高いず思う傟向がありたす。

完党に同意したす。「iferr= nil」はそのたたにしおおきたす。

@ abejide001 try提案は、他の倚くの蚀語の埓来の「try / catch」ではなく、Rustのtry!マクロによく䌌おいたす。 いいミヌムなのに笑

これだけが私にずっおの懞念事項です。Goはすでに新参者にずっお奇劙な蚀語です。そしお今、 tryが特泚のロゞックを持っおいる理由を説明する必芁がありたす。 FWIW、「Rust did it」ず蚀っおも、蚀語に䜕かを远加するこずを正圓化する正圓な理由ではないず思いたす。それはあたり知られおいないだけです。

@機胜を正圓化するために蚀っおいるのではなく、機胜が䜕をしたのかを明確にするために蚀っおいるだけです。 私はtry提案の真っ最䞭です。

これが倧きな違いを生むわけではありたせんが、マクロの代わりにキヌワヌドを䜿甚する堎合でも、Swiftの機胜でもありたす。

正確に䜕を達成しようずしおいるのかに぀いおは、倚少の混乱があるようです。 私芋、問題ぱラヌをチェックする耇数のifブロックを曞き蟌んでいないこずです。 あなたはそれらを䞀床曞けば完了です。 問題は、これらのブロックが耇数あるコヌドを読み取るこずです。 私たちは曞くよりも読むこずをたくさんしたす。 そしお、これらのブロックは実際のコヌドず絡み合っおいるため、実際のコヌドを難読化したす。 さらに悪いこずに、倚くの堎合、それらはほがたったく同じであり、ifブロック内のどこかにわずかな文字列の違いしかありたせん。

私は個人的に叀いチェックを奜みたした-ドラフトを凊理したすが、これは少なくずも゚ラヌずビゞネスパスを分離するのに良い仕事をしたす。 そしお、珟圚、芪゚ラヌず同じこずを繰り返す可胜性が高い各呌び出しずは察照的に、最終的に単䞀の関数スコヌプコンテキストを持぀こずができる可胜性がありたす。

@icholyは曞いた

より合理化された゚ラヌ凊理を芁求する圧倒的なコミュニティフィヌドバックがありたした幎次調査から。 Goチヌムは珟圚その問題に取り組んでいたす。

ここで調査を調べたした https 

どうやら質問は、「今日Goを䜿甚しお個人的に盎面する最倧の課題は䜕ですか」でした。 考えられる答えは「゚ラヌ凊理」です。

その質問ず回答に基づいお、より簡単な構文が必芁であるずどのように掚枬されたのか、真剣に疑問に思いたす。 「゚ラヌ凊理」にも答えたかもしれたせんが、決しお別の構文を芋たかったわけではありたせん。 調査でこのオプションをチェックした堎合、゚ラヌをラップしたり、スタックトレヌスを提䟛したりするこずを蚱可したほうがよいず思いたした。

私の提案は、すべおの゚ラヌ凊理の提案事実䞊、 @ miekgが提案しおいたものから

私はtryの提案を行ったばかりですが、䜕かが足りない堎合を陀いお、「定型文のifステヌトメントを削陀する[...}」以倖に、提案されおいる理由を蚀うのを怠っおいたす。 しかし、ステヌトメントが必芁な堎合にこれらの定型文を削陀する理由に぀いおは蚀及されおいたせん。

私は間違いなく䞊蚘に同意したす。 新しい゚ラヌ倀の倉曎が、Goに関する゚ラヌ凊理の苊情に圹立぀かどうかを芋おみたしょう。 次に、より簡単な構文が必芁かどうかを確認できたす。

ここの人々は、返されたすべおの゚ラヌに泚釈を付ける必芁があるず感じおいるため、 try反察しおいたす。 珟実には、珟圚のコヌドコヌパス暙準ラむブラリを含むでは、゚ラヌチェックの割合が高く、泚釈なしの゚ラヌが返され、 try恩恵を受けたす。 コヌドがどうあるべきかのあなたの信念は、コヌドが道ずは䜕の関係もありたせん。 私にあなたの教矩を惜したないでください。

@icholy゚ラヌを無芖するこずは、

私の提案は、すべおの゚ラヌ凊理の提案事実䞊、 @ miekgが提案しおいたものから

私はこれに匷く同意したす。 Go゚ラヌ凊理の改善がどの機胜をサポヌトすべきかに぀いお、倚くの基本的な意芋の盞違が芋られたす。 人々が蚀及する機胜のさたざたなチャンクはすべお、その名前ず構文をめぐっおバむクシェッドを匕き起こしおいるため、議論はどこにも行きたせん。

提案されおいる新しい゚ラヌ凊理機胜に察しお、より広範なGoコミュニティが実際に䜕を望んでいるのかを詳しく知りたいず思いたす。

さたざたな機胜、人々が提案しおいる゚ラヌ凊理機胜の䞀郚をリストした調査をたずめたした。 私は提案された名前や構文を泚意深く_省略_したした。もちろん、私自身の意芋を支持するのではなく、調査を䞭立にしようずしたした。

参加を垌望する堎合は、共有甚に短瞮されたリンクを次に瀺したす。

https://forms.gle/gaCBgxKRE4RMCz7c7

参加するすべおの人が芁玄結果を芋るこずができるはずです。 そうすれば、人々が実際に䜕を望んでいるのかがよくわかったら、tryの提案がそれらを提䟛するかどうかに぀いおむンテリゞェントな議論を行うこずができるでしょう。 そしお、構文に぀いおの議論に進むかもしれたせん。

@ lane-c-wagner泚釈なしの゚ラヌを返すこずは、たったく返さないこずず同じだず蚀っおいるのですか 線集前のコメントを修正

@icholyああ私は誀解したした。 あなたが「裞」ず蚀ったずき、私はあなたが「_」が゚ラヌを無芖したこずを意味しおいるず思いたした。

この提案は、いかなる行動も有効な行動であっおはならないず䞻匵しおいたす。 この倉曎は、コヌドを読むため、蚀語のすべおのナヌザヌに圱響したす。 そのため、最倧のハヌドルを特定する調査では、このハヌドルを修正する䟡倀があるかどうかをコミュニティに尋ねる必芁がありたす。 この提案は、そのような質問の最も近い評䟡です。

「誰もが自由に無芖できる」ず蚀うのはやめおくださいtry 。 他の人が曞いたコヌドを読みたす。

@ tv42あなたがここで私に話しかけお

あなたが調査した@griesemerは非垞に䞍足しおいたした。 私ぱラヌ凊理に投祚したしたが、私が意図した問題は、冗長性ではなく、完党な型の安党性でした。 ゚ラヌに぀いおのみ別のものを䜜成する方がよいでしょう。

そしお、私はただ合蚈型が必芁です。

これは、゚ラヌ= nilの堎合にgofmtが珟圚フォヌマットする方法に関する提案です。

これはtry提案に぀いおの意芋ではありたせん。

ifステヌトメントが次のような1行の非nil゚ラヌ倀を返す堎合。

err := myFunc()
if err != nil {
    return err
}

gofmtは、独自のifステヌトメントルヌルを緩和しお、次のように1行でフォヌマットできたす。

err := myFunc()
if err != nil { return err }

3行の゚ラヌ凊理コヌドは1行になりたす。 敎理敎頓。 プログラムフロヌを远跡しやすくなりたす。

これでどこに線を匕くかしゃれを認めるに぀いお䜕らかの刀断が必芁になりたす
gofmtルヌルの倉曎。 次のような装食が含たれおいる堎合がありたす。

err := myFunc()
if err != nil { return fmt.Errorf("myFunc() blew up! %v", err }

ただし、耇雑な耇数行の゚ラヌ凊理はそのたたにしおおく必芁がありたす。耇数行で明確か぀明瀺的です。

_try_プロポヌザルは取り䞋げられたした https 

ゞェネリックは誰ですか

これは、゚ラヌ= nilの堎合にgofmtが珟圚フォヌマットする方法に関する提案です。

私はそれを詊したしたが、コヌドは耇数行のフォヌマットよりもその方法ではさらに読みにくくなっおいたす。 tryはその解決策よりもはるかに優れおいたす。

ここでのIMOの問題は、゚ラヌ凊理の実行方法ではなく、無芖されるかどうかです。 if err != nil構文をそのたたにしお、 Error戻り倀の無知を制限するこずはできたせんか レガシヌコヌドの重倧床オプション付きのコンパむラ譊告/゚ラヌにするように。

ここでのIMOの問題は、゚ラヌ凊理の実行方法ではなく、無芖されるかどうかです。 if err != nil構文をそのたたにしお、 Error戻り倀の無知を制限するこずはできたせんか レガシヌコヌドの重倧床オプション付きのコンパむラ譊告/゚ラヌにするように。

倚くの人は、無芖された゚ラヌを衚瀺するリンタヌを望んでいたす。

これを難しい゚ラヌにしたいず思いたすが、すでに曞かれおいる倧量のレガシヌを芋るず、リンタヌも公平です。

https://github.com/kisielk/errcheckは、未凊理の゚ラヌに぀いお教えおくれる䟡倀があるず思いたす@plyhun @sorenvonsarvort

32437の議論に芋られるように、この提案は今のずころ事実䞊受け入れられおいたす。 閉鎖。 問題が再床発生した堎合は、新しい提案を開くこずができたす。

倚くの提案がうたく適合しおいないず感じる理由の1぀は、実際には2぀の異なる問題に同時に察凊しようずしおいるためだず思い始めおいたす。 確かに、ほがすべおの関数呌び出しの埌にerr != nilブロックがあるず、コヌドの流れが奇劙な方法で分割される可胜性がありたすが、確かに利点はありたすが、それは半分にすぎないず思いたす。問題。 もう1぀の問題は、゚ラヌが発生したかどうかに関係なく、耇数の返品を凊理するのが非垞に䞍栌奜になる可胜性があるこずです。

耇数のreturn関数は、2぀の間のわずかな違いにもかかわらず、単䞀のreturn関数ずは非垞に異なった感じがしたす。 これは、耇数の匕数を取る関数の呌び出しに远加の制限があった堎合のようなものです。 時々察凊するのは非垞に奇劙に感じたす。 耇数の戻り倀を持぀関数を呌び出す堎合、ほずんどの堎合、独自の行で呌び出す必芁があり、 :=ず組み合わせるず、他の堎所で説明されおいるさたざたな倉数シャドりむングの問題の䞻な原因ずなるこずがよくありたす。 。 メ゜ッド呌び出しをそれらにチェヌンするこずはできたせん。たた、それらから構造䜓フィヌルドず同じ行の新しい倉数に盎接割り圓おるこずもできたせん。

わからない。 倚分それは私だけです。 しかし、私はGoを10幎近く䜿甚しおおり、耇数の戻り倀を持぀関数を呌び出すこずは、私にずっおは少し厄介なこずもありたす。

ありがずうございたした

if err != nilには実際に1぀の問題があり、 errのスコヌプは本来よりも長くifをむンラむン化するず問題は解決したすが、すべおのケヌスをむンラむン化できるわけではありたせん。

if err := foo(); err != nil {
if _, err := bar(); err != nil {



md5-6a135eb952fe7b24b3389cb16d3244a1



a, err := bar()
if err != nil {



md5-d52f811d3e31bb368bd8045cfb2e93b4



var err error
baz.A, err = bar()
if err != nil {

if err != nil {}ブロックが完了した埌は、 err倉数が関数スコヌプに存圚しないようにする必芁がありたす。 これは、問題を修正するためのtry()提案から構築された私の提案ですhttps://github.com/golang/go/issues/33161。 建蚭的なフィヌドバックが欲しいです。

if err= nil {}ブロックが完了した埌は、err倉数を関数スコヌプに存圚させないでください。

ifブロックが完了した埌、なぜそれが存圚しないはずなのですか コンパむラヌはそれを最適化でき必芁ず思われる堎合、err= stmt\ nif err= nil {}ブロックが完了するず、これらはほずんど垞に䞀緒になるため、粟神的な負荷はありたせん。

私はただあなたの提案を詳现に怜蚎しおいたせんただし、それを曞く努力をしたこずに察する称賛です。 ただし、䞊蚘のコメントでも抂説したように、問題を解決するための提案を掘り䞋げる前に、認識された問題に぀いおさらに調査する必芁があるず思いたす。

@Freeaqingme゚ラヌは、 if err != nilブロックが完了した埌は存圚しないはずです。これは䞻に、すでに存圚しないように動䜜しおいるためです。

CopyFileの䟋では、 r, err := os.Open(src)埌にw, err := os.Create(dst)続きたす。 2番目のerrは、最初の

他にも奇劙なこずがありたす。 err := foo()以降にbar.V, err = baz()ようなものがある堎合、コヌドがリファクタリングされおfooが䞍芁になった堎合は、 baz前にvar err errorを远加する必芁がありたす。 baz行。 。 関数内の別の堎所をリファクタリングしおも、そのような他の堎所に圱響を䞎えるべきではないず思いたす。

技術的には

    r, err := os.Open(src)
    if err != nil {
        return ...
    }
    w, err := os.Create(dst)

errの2番目のむンスタンスは、最初のむンスタンスをシャドりしたせん。 それらは実際には同じ倉数です。 https://golang.org/ref/spec#Short_variable_declarationsで倉数の再宣蚀の説明を参照しお

func doSomeThing{
r、err= os.Openファむル名
panicfmt.Errorferr、 "ファむルを開けたせんでしたs"、filename//
ここはパニックです。

}

朚、2019幎10月10日に11:24でclearcodeの[email protected]は曞きたした

組み蟌み関数を远加できるず思いたす。

䞻匵する

䟋

func doSomeThing゚ラヌ{

r, err := os.Open(filename)
assert(err, "failed to open file: %s", filename) // in this step, just return the error

resp、err= http.GetsomeURL
asserterr、 "リク゚ストに倱敗したした"

}

および゚ラヌを返さない別の関数

func doSomeThing{
r、err= os.Openファむル名
asserterr、 "ファむルを開けたせんでしたs"、filename//ここでパニックになりたす。

}

したがっお、asserterror、args ... interface {}は次よりも優れおいたすif err= nil; {{
゚ラヌを返す}

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/golang/go/issues/32825?email_source=notifications&email_token=AGUV7XQ5HO7GL3YP72R7BV3QN2N55A5CNFSM4H4DL33KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AGUV7XS4JMK44QHIIR3RSGTQN2N55ANCNFSM4H4DL33A
。

芁点は、珟圚の゚ラヌで返される実際の゚ラヌを確認したいずいうこずです。
珟圚の行で機胜したす。

2019幎10月11日金曜日午前9時55分[email protected]は次のように曞いおいたす。

func doSomeThing{
r、err= os.Openファむル名
panicfmt.Errorferr、 "ファむルを開けたせんでしたs"、filename//ここはパニックです。

}

11:24 clearcodeの朚、2019幎10月10日には[email protected]
曞きたした

組み蟌み関数を远加できるず思いたす。

䞻匵する

䟋

func doSomeThing゚ラヌ{

r, err := os.Open(filename)
assert(err, "failed to open file: %s", filename) // in this step, just return the error

resp、err= http.GetsomeURL
asserterr、 "リク゚ストに倱敗したした"

}

および゚ラヌを返さない別の関数

func doSomeThing{
r、err= os.Openファむル名
asserterr、 "ファむルを開けたせんでしたs"、filename//ここでパニックになりたす。

}

したがっお、asserterror、args ... interface {}は次よりも優れおいたすif err= nil; {{
゚ラヌを返す}

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/golang/go/issues/32825?email_source=notifications&email_token=AGUV7XQ5HO7GL3YP72R7BV3QN2N55A5CNFSM4H4DL33KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AGUV7XS4JMK44QHIIR3RSGTQN2N55ANCNFSM4H4DL33A
。

率盎に蚀っお、 try提䟛する暗黙のリタヌンは必芁ありたせん。 ゞェネリックスがある堎合は、代わりにモナド颚の動䜜を䜿甚する゜リュヌションをお勧めしたす。

type Result<T> interface {
  Expect(err error) T
  OrElse(defaultValue T) T
}

func From<T>(value T, err error) Result<T> { ... }

私にずっお、これは珟圚提案されおいるビルトむンよりもはるかにクリヌンですが、返されるメ゜ッド倀、゚ラヌず結果が急増するため、䞊蚘にさらに倉曎を加える必芁がありたす

RustのOkずErrはずおも䌌おいたす。
if err != nil {}倚分1ビット良いず思いたす。

@Yanwenjiepyは意図的なもので、私はRustのResultタむプの倧ファンです。

Goを習埗しおから10分も経っおいたせん。 私が芋おいたコヌドで最初に気付いたのは、このコピヌが䜕床も䜕床も貌り付けられおいたこずです。

someValue, err := someFunction();
if err != nil {
  panic(err)
}

私は明らかに専門家ではありたせんが、このスレッドにたどり着くのに䞀目芋ただけで䟡倀があるかもしれたせん。

これは、孊習甚のコヌドスニペットを芋おいるためです。 実際のコヌドは、パニックやクラッシュだけでなく、゚ラヌを凊理する必芁がありたす。

本圓ですが、゚ラヌはグルヌプ化できたすそしお倚くの堎合そうすべきです。 そのため、try / catchブロックは他の蚀語に存圚したす。 たずえば、次のようなものは、私にずっお恐竜のような匂いがはるかに少ないでしょう。

try {
  foo, throw err := someFunction();
  bar, throw err := foo.get();
  baz, throw err := bar.make();
  qux, throw err := baz.transform();
} catch(err) {
  // "Unable to foo bar baz qux."
  tryHarder();
}

もう䞀床、完党な玠人。 しかし、コヌドは単なるシンボルであり、それらが十分に繰り返される堎合は、そのためのシンボルを䜜成するこずもできたす。 これは非垞に頻繁に繰り返される蚘号のようです。

RobPikeのErrorsAre Valuesの投皿を芋お、ヘルパヌを䜿甚しお゚ラヌをマヌゞし、それらすべおを䞀床に凊理する方法を確認するこずをお勧めしたす。 実際には、1぀の句ですべおの䟋倖をキャッチするこずは、実際に䜕が起こったかに぀いおの情報を隠すこずになるため、䟋倖を含むほずんどの蚀語では悪いスタむルず芋なされたす。 そしお、䟋を拡匵しお、キャッチされた個々の䟋倖を分解し、その情報を砎棄しない堎合、コヌドはGoず同等である限り終了したす。

リンクをありがずう。 errWriterは完党に無難な解決策です。

本圓ですが、゚ラヌはグルヌプ化できたすそしお倚くの堎合そうすべきです。 そのため、try / catchブロックは他の蚀語に存圚したす。 たずえば、次のようなものは、私にずっお恐竜のような匂いがはるかに少ないでしょう。

try {
  foo, throw err := someFunction();
  bar, throw err := foo.get();
  baz, throw err := bar.make();
  qux, throw err := baz.transform();
} catch(err) {
  // "Unable to foo bar baz qux."
  tryHarder();
}

もう䞀床、完党な玠人。 しかし、コヌドは単なるシンボルであり、それらが十分に繰り返される堎合は、そのためのシンボルを䜜成するこずもできたす。 これは非垞に頻繁に繰り返される蚘号のようです。

各関数が重耇する゚ラヌタむプを返し、すべおの関数の結果を適切に凊理する必芁があるずしたしょう。tryHarderをどのように蚘述したすか

try {
  foo, throw err := someFunction();  // err could be TypeA and TypeB
  bar, throw err := foo.get();       // err could be TypeB and TypeC
  baz, throw err := bar.make();      // err could be TypeA and TypeC
  qux, throw err := baz.transform(); // err could be TypeB and TypeD
} catch(err) {
  tryHarder(); // tell me how to handle each error?
}

以䞋のコヌドを理解するのに他の誰かが1分しかかかりたせん

foo, err := someFunction();  // err could be TypeA and TypeB
if err != nil {
 // handle err
}

bar, err := foo.get();       // err could be TypeB and TypeC
if err != nil {
  // handle err
}

baz, err := bar.make();      // err could be TypeA and TypeC
if err != nil {
  // handle err
}

qux, err := baz.transform(); // err could be TypeB and TypeD
if err != nil {
  // handle err
}

各関数が重耇する゚ラヌタむプを返し、すべおの関数の結果を適切に凊理する必芁があるずしたす。

その䟋では、あなたは完党に正しいです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡