2009-06-26 7 views
1

今日、私は面白いジレンマに遭遇しました。私は、情報を処理し重複する値をチェックし、重複していない次の番号を返す関数を持っています。だから、私はこのようなものを持っている:キャッチ、ハンドル、例外の再発行?

Public Function GetNextNonDuplicateNumber(NumberToCheck as Long) as Long 

     //the non-duplicate the function will return 
     Dim NonDuplicate as Long 

     If CheckForDuplicate(NumberToCheck) = True Then 
      Throw New DuplicateException() 
     Else 
      NonDuplicate = NumberToCheck 
     End If 

End Function 

次に、関数の一番下に、私はこのように、私はこれ以上重複していないまでインクリメントすることにより、重複を処理するcatchブロックがあります。

Catch ex as DuplicateException 
    NonDuplicate = IncrementToNonDuplicateValue(NumberToCheck) 
    Throw ex 
    Return NonDuplicate 
End Function 

ご覧のとおり、特に例外を処理したいのですが、機能の外にある他のコードに警告する必要があるため、終了した時点で例外をスローしたいと思います。

問題を投げるのは、単にnullの値を持つ関数から出てくるということです。私はtry/catchについて間違った方法を考えているのですか、それともこの問題を回避する手段がありますか?

答えて

3

例外をキャッチしてそれから回復した場合(IncrementToNonDuplicate ...)、例外をスローする理由はありません。 catchとend tryの間のコードは、ファイルやデータウェアラを再スローする場合のようにリソースをクリーンアップするだけです。

代わりに、NonDuplicate値と関数のエラーに関する必要な情報を含む構造体を返すことができます。 他の方法は、 "無効な番号:それは...などの情報を含むカスタム例外をスローすることです。

1

重複が見つかったかどうかを示すブール値を返し、渡すパラメータを変更できます参照することにより、あなたが値を更新できるようにします。

Public Function GetNextNonDuplicateNumber(ByRef NonDupeNumber as Long) as Boolean 
+0

これは実際には非常に健全なアプローチであり、かつ模倣 'Int32.TryParse'など。(7年後、私は知っているが、それでも、これはOPのあるべき選択の経路)。 – Abel