finallyブロックの戻り値にアクセスすることは合法であり、可能ですか?

StackOverflow https://stackoverflow.com/questions/304847

質問

関数のリターンコードと変数に応じて、関数を終了する前にusererror文字列を設定したい。

現在、次のものがあります:

Dim RetVal as RetType

try
...
if ... then
    RetVal = RetType.FailedParse
    end try
endif
...

finally
    select case RetVal
        case ...
            UserStr = ...
    end select
end try

return RetVal

ret RetType.FailedParseを使用して、finallyブロックでこれにアクセスすることは可能ですか?

役に立ちましたか?

解決

C#でこれを行う唯一の実際の方法は、メソッドの開始時に値を保持する変数を宣言することです。つまり、

SomeType result = default(SomeType); // for "definite assignment"
try {
   // ...
   return result;
}
finally {
    // inspect "result"
}

VBでは、結果に直接アクセスすることができます -とにかくIIRCは上記のように(メソッド名を「結果」として)動作します。警告:私はVBの人ではない本当にです...

他のヒント

tryブロックから変数を宣言し、finallyブロックが設定されている場合はチェックインします。

VBで(合法的に)次のことができるかどうか疑問に思っていました:

Public Function MyFunc() as integer
    Try
      if DoSomething() = FAIL Then
        return FAIL
      end if

  Finally
      if MyFunc = FAIL then
          Me.ErrorMsg = "failed"
      endif
  End Try
End Function

MyFunc = FAILの設定は(VBからのハングオーバーとして)正当であることがわかっていますが、書き込み専用ですか、それとも読み取り可能ですか?私は、これが次のような貧弱なコーディングであることに懸念しています

if MyFunc = FAIL Then

に似すぎています

if MyFunc() = FAIL Then

結果はまったく異なります!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top