-6

少し問題があります。ブロック内で何が起こるかに応じて変更される try-catch-finally ブロックの外側に文字列を持つ関数があります。完成したら展示したいと思います。私の問題は、ブロックで変更された値が元の値に戻ることです。どうすればこれを修正できますか?

string error = "No issues";

try{
    error = "Correct";
}catch(Exception ex){
    error = "Wrong:" + ex.Message.ToString();
}finally{
    // Closes connection
}

MessageBox.Show(error);
4

2 に答える 2

0

投稿したコードは、テキストを含むメッセージ ボックスを表示します。

正しい

例外がスローされない場合、そうでない場合はメッセージ

間違い: (および例外のメッセージ プロパティ)

メッセージは表示されません

問題ない

errortry ブロックの最初の行での初期値を上書きするためです。

errorあなたが投稿したコードを考えると、値が失われることはありません( nullになると思います)。最終的にエラーは範囲外になります (たとえば、このコードが定義されているメソッドを終了するとき)。

アップデート

私はあなたのコードを取得し、まったく新しい WinForms プロジェクトを作成し、Form1 をダブルクリックして Load イベント ハンドラーを作成し、次のようにコードに投稿しました。

    private void Form1_Load(object sender, EventArgs e)
    {
        string error = "No issues";

        try
        {
            error = "Correct";
        }
        catch (Exception ex)
        {
            error = "Wrong:" + ex.Message.ToString();
        }
        finally
        {
            // Closes connection
        }

        MessageBox.Show(error);
    }

その結果、「正しい」というメッセージ ボックスが表示されました。

それが実際のコードで見られるものではない場合、問題を再現するのに十分なコードを共有していません。

于 2013-01-11T03:36:18.907 に答える
0

問題の文字列がメソッドの外で宣言されているかどうかはわかりません。文字列に新しい値が与えられていることを 100% 確信している場合は、次のコードで問題が解決する可能性があります。

static void Foo(string s)
{
    try
    {
        s = "OK";
    }
    catch { }
}

static void Main(string[] args)
{
    string temp = "??";
    Foo(temp);
    Console.WriteLine(temp); //prints ??
    Console.ReadLine();
}

文字列を値で渡しているためです。値を変更する必要がある場合は、次のいずれかを行う必要があります。

refパラメータを作成します。

static void Foo(ref string s)

そしてそれを呼び出します

Foo(ref temp);

またはメソッドから新しい値を返します。

    static string Foo(string s)
    {
        try
        {
            s = "OK";
        }
        catch { }
        return s;
    }

そしてそれを呼び出します:

temp = Foo(temp);
于 2013-01-11T02:11:46.497 に答える