Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

業務上起こりえない判定ルーチンを書くのは冗長?

ずいぶん以前に例外の扱いに対して
http://blogs.wankuma.com/ognac/archive/2006/09/22/39319.aspxhttp://blogs.wankuma.com/ognac/archive/2007/08/06/88970.aspxを書いたのですが、お陰様でスタンスが決まりました。
 プログラムは落ちてはいけないというのが私のベースです。
    Public Function Div(ByVal a As Integer, ByVal b As Integer) As Integer
        If b = 0 Then Throw New ApplicationException(" b=0 で呼ばれた")
        '若しくは
        Debug.Assert(b <> 0, " b=0 で呼ばれた")
        Return a \ b
    End Function
のように、例外が予想できる箇所には判定文を書きます。 
   if isnumeric(a) then b = cint(a)   など

業務ロジック上 b=0 で呼ばれることはない。だから
    Public Function Div(ByVal a As Integer, ByVal b As Integer) As Integer
        Return a \ b
    End Function
「これで十分だ。事前判定は冗長だから不要だ。」との意見もあります。

RDBのデータ取得でも
    Public Function 項目引用() As String
        Dim dt As New DataTable()
        Dim sql As String = "select 項目 from xxxx where code=@code"
        Dim param As New List(Of String)
        Dim cmd As New SqlCommand
        'パラメータセット
        ':
        Dim adpt As SqlDataAdapter = New SqlDataAdapter(cmd)
        adpt.Fill(dt)

        Dim 引用値 As String
        With "A:必ずレコードが存在する前提で書かれている"
            引用値 = dt.Rows(0)(0).ToString
        End With
        With "B:事前判定を施す"
            If dt.Rows.Count > 0 Then
                引用値 = dt.Rows(0)(0).ToString
            Else
                Debug.Assert(False, "データがなくなっている!")
            End If
        End With

        Return 引用値
    End Function

「データが存在することはシステムの前提だから、都度データ存在Checkするのは冗長で無意味だ」との意見もあります。
 何らかの理由でデータが無くなったら"落ちまっせ"と言うと、「それは不可抗力だからStackOverなどの不可避例外と同等だから、OSの例外に任せたら良い」とのこと。
「アプリで拾う例外は、回復可能だから拾うので、回復不可能な例外は拾うべきではない」..と主張されると、一理あるような気がする優柔不断な私...orz。
 確かに DiskFullやStackOverなど手の出せない例外もありますが、想定できる異常ケースは記述したほうが良いと考えてます。
 c = a \ b
で b=0 の判定が書かれてないと、手抜きや無知と思われそうで、精神的にイヤというのもあります。
精神安定剤と冗長なコードはトレードオフ?
これって見てくれを気にしている事になるのかなぁ

投稿日時 : 2008年1月31日 10:36

Feedback

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 11:37 THREE-ONE

private なメソッドの場合は省くことはありますが、それ以外では基本的にちゃんと書きますね。将来どういう使い方をするかわかりませんし。
きちんと書いていれば、同じコードを特に何も考えず他のプロジェクトへ移植できますし。
データがないのは不可抗力というのはわかる気もしますが、原因をユーザーにわかりやすい文言で表示するだけでも、例外を拾う価値はあると思います。

# 投げるなら DividByZeroException か ArgumentException じゃないかなーと細かいツッコミ。

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 11:40 シャノン

> プログラムは落ちてはいけないというのが私のベースです。

データが無ければ処理ができないケースでは、実行を継続できないわけですから、落ちようが落ちまいが大差ないような気がします。
また、「落ちる」とはどういうことかというのもあると思います。
想定しない例外に対して一切の処理をせず、ランタイムライブラリが出すデフォルトの例外ダイアログが出ることを言うと思います。
が、どんな例外もとりあえず捕捉してログに書き出して、「予期しないエラーが発生したため終了します。製造元に連絡してください」とかいうメッセージを出すのは「落ちない」と言えないと思います。

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 12:04 ghost_shell

> プログラムは落ちてはいけないというのが私のベースです。

信念としてはわかりますが、どこまでその思いを遂げられるか、というのはケースによって変わってきますね。
(シャノンさんが言われているので以下省略)

THREE-ONE さんのコメントから
># 投げるなら DividByZeroException か ArgumentException じゃないかなーと細かいツッコミ。

SystemException派生クラスは使わないスタンスかもしれませんよーと細かいツッコミ。

# ゼロ除算でDividByZeroExceptionって要る? 2008/01/31 12:30 GJAX IS UNDER CONSTRUCTION! (※日本語ブログ)

ゼロ除算でDividByZeroExceptionって要る?

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 13:54 凪瀬

>> プログラムは落ちてはいけないというのが私のベースです。
> データが無ければ処理ができないケースでは、実行を継続できないわけですから、落ちようが落ちまいが大差ないような気がします。

バグなどに起因するエラーは、できるだけ速やかにその存在が報告されるべき、と考えられます。
そうすると、何かしらの異常を検出した場合に、どうやってそれをアピールするかがポイントになります。
これは「例外を握りつぶしてはいけない」という教訓にも通じるものがありますね。

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 14:03 えムナウ

># 投げるなら DividByZeroException か ArgumentException じゃないかなーと細かいツッコミ。
ArgumentOutOfRangeException ですね。

>SystemException派生クラスは使わないスタンスかもしれませんよーと細かいツッコミ。
例外処理の実施
http://msdn2.microsoft.com/ja-jp/library/seyhszts(VS.80).aspx
ほとんどのアプリケーションでは、Exception クラスからカスタム例外を派生します。本来、カスタム例外は ApplicationException クラスから派生しなければならないと考えられていましたが、実際には、このことで大きな価値が付加されたことはないようです。

オブジェクトの現在の状態に対して、プロパティ セットまたはメソッドの呼び出しが適切でない場合には、InvalidOperationException をスローします。
不正なパラメータが渡された場合には、ArgumentException または ArgumentException の派生クラスをスローします。

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 14:22 えムナウ

>Debug.Assert
Debug.Assert はリリース後に注意が必要です。
Debug.Assert 自体が無いものとして扱われますから、その後で予期せぬ事態が発生するかもしれません。

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 16:27 Ognac

コメント有難うございます。
"落ちない" の定義に個人差がありました。私はBlue画面を含む、"予期しないエラー....開発元に.."の一方的な画面がでて、データリカバリー不可能なまま死ぬこと指していました。
 例外を捕捉して、可能な限りアプリやインスタンスの状態をLogなりに吐き出してメッセージを出すのが礼儀としてます。この状態も死んでる状態ですが、一方的に落ちるんじゃないので"落ちない"に含めてます。...考えたら変な表現......かえってややこしくなりました。...
DividByZeroException 例外でなく ApplicationExceptionにしているのは、業務ロジックで起こりえない事態という面を主にしたいのでApplicationExceptionにしたのですが、ApplicationExceptionの使い分けをMSが否定しているのですね。ArgumentExceptionの派生が適しいてるのですね。ありがとうございます。

>Debug.Assert はリリース後に注意が必要です。
Trace.Assert の画面が実稼動時にでるのも難がありますので、例外起こして拾うのが良いですね。
Debug.Assertの適切な使い方も難しいです。業務ルール的に走らない分岐に埋め込んで、ロジックバグの発見に使用したりしています。稼動後残骸が残ったままになって、恥ずかしい思いもしましたが.....

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 19:36 えムナウ

Debug.Assert と Exception をダブルで仕込んでおいたらどうでしょうかねぇ。

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 21:08 Hirotow

「キャッチしないか、しかるべき処理をしてからthrow;でそのまま投げるか。」
の2択だと思います。
凪瀬さんも言っていますが、変に握りつぶしたり、いじったりすると保守性が下がります。
また情報の利用しやすさも.NET標準のものが一番です。

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/01/31 21:31 かつのり

メソッドに冗長とも思えるアサーションを書くのは、
私的には全然問題がないというか、激しく賛成派。
メソッドのコードを見れば、そのメソッドの仕様がわかるし。

素直にアサーションエラーを示す例外がスローされてくれると、
呼び出し元の渡す値を機械的に調べればいいので、
結構保守しやすいと思いますよ。

# re: 業務上起こりえない判定ルーチンを書くのは冗長? 2008/02/01 0:15 Ognac

コメントありがとうございます。
>また情報の利用しやすさも.NET標準のものが一番です。
いったん自前の処理を経由して、標準に投げるか否かを決めるのがベターかと思うのです。結果的に握りつぶすのはNGであるのは同意。
>私的には全然問題がないというか、激しく賛成派。
まったく同意。 => 反対派がいるのも事実で気まずい関係になるのは本意でないので、難儀なことです。


# yezi20160620@163.com 2017/09/28 9:59 wwwww

http://www.shoesjordan.us.com
http://www.lacosteonlineshop.us.com
http://www.hermes-belt.co.uk
http://www.michaelkors-outletonlines.us.com
http://www.longchamphandbagsoutlet.us.org
http://www.truereligionjeans-outlets.us.com
http://www.longchamphandbags.us.org
http://www.nikehuaracheshoes.us.com
http://www.converseoutlet.us.com
http://www.jordan11retro.us.com
http://www.adidasstansmith.us.com
http://www.cheap--jordans.us.com
http://www.authenticjordanscheap.us.com
http://www.jordan-retro.us.com
http://www.thelightupshoes.us.com
http://www.yeezy-boost.us.com
http://www.yeezy-shoes.us
http://www.retro-jordans.us.com
http://www.nikedunks.us.org
http://www.nikebasketballshoes.us.com
WWW

# re: [Tips][Visual Studio]Visual Studio 2008で、ソースコードの行数をカウントする方法 2017/09/29 9:56 chenlina

http://www.oakleysunglassessport.us.com
http://www.longchampoutlet-online.com
http://www.uggbootsclearances.com.co
http://www.truereligionjeans-outlet.us.com
http://www.truereligionsale.com.co
http://www.ray-bansunglassesoutlets.us.com
http://www.ugg.com.co
http://www.louisvuitonnoutlet.com
http://www.hollisterclothing.us.org
http://www.northfaceoutletstore.us.org
http://www.hermesoutlets.us.com
http://www.outletugg.com.co
http://www.canadagoosesale.com.co
http://www.cheap-jordan-shoes.us.com
http://www.newbalance-shoes.us.com
http://www.pololaurenshirts.com
http://www.michaelkorsoutletsonlinesale.us.com
http://www.wwwuggaustralia.co.uk
http://www.pandora-charms-canada.ca
http://www.swarovski-jewelry.name
http://www.ugg-outlets.com.co
http://www.coachoutlet70off.us.com
http://www.truereligion-jeans.com.co
http://www.michaelkorsoutletoff.us.com
http://www.fitflops.org
http://www.coachoutletonlineshopping.us.org
http://www.baseballjerseys.us.com
http://www.toryburchoutletsonline.us.com
http://www.northfacejacket.us.com
http://www.ugg.me.uk
http://www.ray-bansunglassesoutlet.com.co
http://www.ray-bansunglasses2017.us.com
http://www.ralphlaurenoutlet-poloshirts.us.com
http://www.oakleysunglassesofficialsite.us.com
http://www.ralphlauren.eu.com
http://www.poloralphlaurenoutletoff.us.com
http://www.uggboots-onsale.us
http://www.oakleysunglasses2017.us.com
http://www.nikeblazers.us
http://www.pandorajewelryoutlet.us.org
http://www.cheapjordansshoes.us.com
http://www.nikeairjordans.co.uk
http://www.uggbootsaustralia.in.net
http://www.salomon-shoes.in.net
http://www.uggsaustraliaboots.us.com
http://www.uggsclassicboots.us.com
http://www.ugg-italia.it
http://www.hermesbirkinhandbags.us.com
http://www.christianlouboutin.name
http://www.tommy-hilfiger-canada.ca
http://www.uggsadd.com
http://www.mlbjerseyswholesale.us.com
http://www.nikerosherunsale.co.uk
http://www.officialcoachfactoryoutletonline.us.com
http://www.canadagoose.com.co
http://www.michaelkorsuk.me.uk
http://www.raybanpascher.fr
http://www.nikeoff.com
http://www.ferragamooutlet.us.com
http://versace.sunglassescheap.us.com
http://www.ray-ban-sunglasses.com.au
http://www.jordans-fusion.com
http://www.coach-outlet.nom.co
http://www.adidasoutletstore.net
http://www.wholesale-nfl-jerseys.us
http://www.adidasstansmith.co.uk
http://www.oakley-sunglassesonsale.us.com
http://www.michaelkors--outlet.us.org
http://www.ukuggboots.co.uk
http://www.outletthenorthface.us.com
http://www.pandoracharmjewelry.us.com
http://www.coachoutletstoreonlineofficial.us.com
http://www.burberryoutlet-canada.ca
http://www.uggsaustralia.it
http://www.northface-clearance.us
http://www.fitflopssaleclearance.us.org
http://www.uggfactoryoutlet.com.co
http://www.redbottoms.org.uk
http://www.michaelkorshandbags.nom.co
http://www.burberryusa.us.com
chenlin20170929

# Jordan 11 Concord 2018 2019/04/27 9:48 ecxyyll@hotmaill.com

The other is to pay for the renovation of the old house, or to overthrow the reconstruction, to build a good government inspection and acceptance, and then subsidize the renovation of the dangerous building of 15,700 yuan.

# Pandora jewelry Outlet 2019/04/28 9:41 nwgvvbk@hotmaill.com

He couldn’t drive himself into work on Wednesday, however, and said he still has some restrictions as he goes back to work and begins to rehab his hip.

# Yeezy 2019/05/03 10:29 hbtvim@hotmaill.com

"I didn't see fatigue (in Game 5)," Kerr said. "I just saw a lack of urgency, and you can't win a playoff game without urgency. It's not that easy."

# Nike 2019/05/05 10:04 zplkgzxxm@hotmaill.com

"No one was there to hold his hand, to comfort him, to save his life," she told the court. "The person we trusted to serve and protect did not."

# Nike Air Zoom 2019/05/11 18:42 qwwjhxnnulc@hotmaill.com

The 67-year-old’s contract currently runs through 2025 at Alabama, which played a big part in why he wanted to solve any issue with his hip now. He didn’t want it lingering into the season this fall or to cut his career short.

# Travis Scott Jordan 1 2019/06/04 13:45 vjueybyqo@hotmaill.com

"I didn't see fatigue (in Game 5),Jordan" Kerr said. "I just saw a lack of urgency,Jordan and you can't win a playoff game without urgency. It's not that easy."

# pandora jewelry 2019/06/14 19:03 slrxfltod@hotmaill.com

http://www.nike--outlet.us/ Nike Outlet

# Nike Outlet 2019/06/16 3:56 nhtuseulu@hotmaill.com

http://www.authenticnflcheapjerseys.us/

# Nike Plus 2019/06/26 10:53 hpgapas@hotmaill.com

http://www.cheapjerseysfromchina.us/ cheap jerseys

# NFL Jerseys Cheap 2019/07/06 3:49 foqrvmfk@hotmaill.com

http://www.basketball-jersey.us/ NBA Jerseys

# Yeezy 2019/07/28 11:58 ombprusokla@hotmaill.com

http://www.nfl-jerseys.us.org/ NFL Jerseys

# Yeezy 2019/08/03 7:58 zewjaialy@hotmaill.com

http://www.nikeoutletonlineshopping.us/ Nike Outlet Online

# Adidas Yeezy 2019/08/09 0:38 gtdpbzoofvh@hotmaill.com

http://www.nikeoutletonlineshopping.us/ Nike Outlet Online

# Yeezy 2019/08/10 11:26 dwvhnv@hotmaill.com

http://www.adidasyeezy.us.com/ Adidas Yeezy

# Yeezy 2019/08/16 11:40 aquswqazc@hotmaill.com

http://www.yeezy-shoes.in.net/ Yeezy Shoes

# Yeezy Boost 350 V2 2019/09/03 13:45 kdqhok@hotmaill.com

paynjinqr,If you have any struggle to download KineMaster for PC just visit this site.

タイトル
名前
Url
コメント