0

ログイン機能のコードがあります。tryステートメント内でreturnステートメントを認識させることができません。これは、それを配置する唯一の論理的な場所のようです。returnステートメントが現在ある場合、パスワードが正しくない場合でもユーザーはログインできます。returnステートメントを他の場所に置くと、「すべてのコードパスが値を返すわけではありません」というエラーが表示されます。

    public static User selectUser(string userName, string password)
    {
       // code to validate user
        try
        {
                if (isUserValid)
                {
                    MessageBox.Show("Login successful!");
                }
                else
                {
                    MessageBox.Show("Login failed");
                }
            }
        }
        catch (Exception e)
        {
             MessageBox.Show(e.ToString());
        }
        return aUser;
    }
4

5 に答える 5

3

MSDN には、取得したエラー コードの説明にエラーの非常に良い例があります - CS0161

サンプルには複数の「コード パス」があります。つまり、if/try ステートメントの条件に基づいて実行される一連のコマンドです。

主な可能なパスは次のとおりです。

  1. ユーザーは有効で、例外はありません: try ブロック、メッセージ ボックス 1、関数の終了
  2. ユーザーは無効です。例外はありません: try ブロック、メッセージ ボックス 2、関数の終了
  3. 検証中の例外: try ブロック、catchブロック、関数の終わり

コード パスの一部 (つまり、質問の 1 と 2) からのみ結果を返し、return「関数の終わり」から削除すると、3 つのコード パスのうち 2 つだけに return ステートメントが含まれます。

あなたの場合の修正は、常に関数の最後にあり、有効なユーザー オブジェクトがある場所からreturn null;飛び出すことです。return validatedUser;

于 2013-03-16T06:41:50.930 に答える
3

成功した場合にのみユーザー オブジェクトを返す必要があります。それ以外の場合は null を返します。ユーザーが認証されているかどうかを判断するために、selectUser メソッドを使用するときにユーザー オブジェクトと null をチェックします。

User aUser = null;
try {
            while (dbReader.Read())
            {
                if (dbReader.HasRows)
                {
                    MessageBox.Show("Login successful!");
                    aUser = new User();
                }
                else
                {
                    MessageBox.Show("Login failed");
                }
            }
        }

catch (Exception e) {
                        MessageBox.Show(e.ToString());
                    }
finally {
          return aUser;
}
于 2013-03-16T06:29:30.130 に答える
2


    public static User selectUser(string userName, string password)
    {
        User aUser = new User();
        if (sConnection.State == ConnectionState.Closed)
            sConnection.Open();
        OleDbCommand cmd = sConnection.CreateCommand();
        OleDbDataReader dbReader = null;
        string sql = "SELECT * FROM [User] WHERE ([userName]='" + userName + "' AND [Password]='" + password + "')";
                        cmd.CommandText = sql;
            dbReader = cmd.ExecuteReader();
        try
        {
            while (dbReader.Read())
            {
                if (dbReader.HasRows)
                {
                    MessageBox.Show("Login successful!");
                    aUser.UserName = username;
                    return aUser;
                }
                else
                {
                    MessageBox.Show("Login failed");
                    aUser.UserName =string.empty;
                }
            }
        }
        catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                aUser.UserName = string.empty;
            }
        return aUser;
    }

この関数を呼び出した後、戻り値IsNULLofEmpty(aUser.Username)を確認してください

于 2013-03-16T06:36:41.133 に答える
2

はいC#では、Userタイプの変数を返さないフローが少なくとも1つ存在する場合は許可されません。User型の変数を返すため、コードは正常に機能するはずです。あなたがすべきことは、ur関数内にメッセージを表示せず、urが呼び出した場所にメッセージを実装することです。呼び出しステートメントの周りにtry catchブロックを配置するだけで、ユーザーが存在しないときに何が起こっているかを知ることができます(オブジェクト関数によって返されるには、チェックできるいくつかのプロパティが必要です)

その場合、uはおそらく、else条件で関数の戻り値をチェックして、それに応じてメッセージを表示できます。

于 2013-03-16T06:40:32.577 に答える
-1

ビジネス ロジックではなく、ビュー ロジックで例外を処理します。

このようなもの:

class View
{
    public void Login(string username, string password)
    {
        try
        {
            var user = _users.SelectUser(username, password);
            MessageBox.Show(
                string.Format("valid user: {0}", user.UserName));
        }
        catch (InvalidUserNameOrPasswordException)
        {
            MessageBox.Show("Invalid username or password");
        }
    }
}

public class Users
{
    public User SelectUser(string userName, string password)
    {
        if (!ValidUser)
        {
            throw InvalidUserNameOrPasswordException();
        }

        return new User();
    }
}

このソリューションでは、メソッドの結果に対してコードを呼び出す必要がないことに注意してください。if-else

- アップデート -

現在は InvalidUserNameOrPasswordException のみをキャッチ

-- update2 --

私が言おうとしている点は、例外ベースのプログラミングが提案され、解決策として受け入れられているということです。詳細については、この (皮肉な) 投稿を読んでください。ここでは、例外ベースのプログラミングが楽しくやや皮肉な方法で説明されています。

于 2013-03-16T06:31:39.633 に答える