1

catch メソッド内に 1 つの if-else ブロックを記述しようとしていますが、「すべてのコード パスが int 型を返すわけではありません」というエラーが表示されます。

基本的に、UserName と Password を Sql CE データベースに保存するメソッドを作成しており、1 つの特定のエラーをテストしたいと考えています。(UserName は既に存在します。) UserName 列は一意であるため、NativeError = 25016 で確実に SqlCeException をスローします。それをエラー メッセージと共に表示するか、他の例外をより一般的な方法で処理します。

私のコードは次のとおりです。

  try
  {
    //insert command  (This is where the duplicate column error is thrown)
    //Select @@Identity & Return it
  }
  catch (SqlCeException ex)
  {
   if (ex.NativeError == 25016)
        MessageBox.Show("Username already in use."); 
   else
     //whatever
  }

別のより一般的なメッセージを表示しようとしましたが、ノーリターンエラーが発生しました。新しい例外をスローして、別のブロックでキャッチしようとしました。同じエラー。-1 を返そうとしました (一種のフラグ値として)。同じエラー。

この特定のケースでは、SqlCeException よりも具体的なエラーはないようです (ただし、debug-fu に失敗した可能性があります)。

クリエイティブな回避策はありますか? 最悪の場合、このメソッドを呼び出す前に DB でユーザー名の重複をチェックするメソッドを作成します。

4

4 に答える 4

6

メソッドが を返すようintです。intcatch ブロックからtype の値を返す必要があります。

  try
  {
    //insert command  (This is where the duplicate column error is thrown)
    //Select @@Identity & Return it
  }
  catch (SqlCeException ex)
  {
   if (ex.NativeError == 25016)
        MessageBox.Show("Username already in use."); 
   else
   {
     //whatever  
   }
   return -1;
  }
于 2012-11-25T06:17:10.397 に答える
2

関数が値を返すように聞こえますint

あなたのtryブロックでは、整数値を取得して返します。それはいいです。

ブロックではcatch、整数を返すことについて言及していません。これが問題です。

そのため、関数が例外パスを取る場合、整数を返すことができないため、エラーが発生します。

于 2012-11-25T06:17:26.307 に答える
0

関数全体が値を返す必要があります。try-cathc で例外を食べているので、関数の最後に何らかのリターンが必要です。

于 2012-11-25T06:18:00.473 に答える
0

finally ブロックを使用して int を返します。

 try
  {
    //insert command  (This is where the duplicate column error is thrown)
    //Select @@Identity & Return it       
  }
  catch (SqlCeException ex)
  {
   if (ex.NativeError == 25016)
        MessageBox.Show("Username already in use."); 
   else
     //whatever
  }
  finally
  {
    return -1;
  }

ブロックを試行して Identity 値を返すと、最終的return -1には効果がありません。参照

于 2012-11-25T06:20:24.433 に答える