2016-03-26 11 views
0

私はwcf Serviceを使用してDBにデータを挿入しています。あるWCFサービスメソッドから他のWCFメソッドに例外を渡し、そこからクライアントに例外をスローします。こここの再スロー例外は何が問題になりますか?

マイコードである:WCFサービスの

データの挿入方法:サービス公開されたメソッド(パブリック)

public int insertLocation (string name) 
{ 
try 
{ 
    // this method communicates with client 
    dataconnection.insertStatements(cmd); 

}  
    catch 
    { 
    throw; // Here i'm getting error 
    } 
} 
あるDB

にデータを挿入する方法
public int insertStatements(SqlCommand cmd) 
{   
    Try 
    { 
    //insert data to the db 

    } 
catch(SqlException ex) 
{ 
    if (ex.Number == 2627) // if unique key constraint error 
    { 
    throw new FaultException("error reason", new FaultCode("Error Code: "); 
    } 
    else 
    { 
     throw new FaultException("DB error: ", new FaultCode("Error Code: " +); 
    } 
} 
catch (FaultException ex) 
{ 
    throw new FaultException("Unknown Error",new FaultCode("Unknown Error")); 
} 
} 

WCF挿入位置法、

私のクライアント:winformアプリケーション

try 
{ 
    AreaDataServicesClient DataObject = new AreaDataServicesClient("BasicHttpBinding_IAreaDataServices"); 
    int rowsAffected = DataObject.InsertProvince(ProvinceObject.AreaName, ProvinceObject.AreaKm); 
     return rowsAffected; 
    } 
    catch(FaultException ex) 
    { 
    messagebox.show("erro occured"); 
    } 

これは私が取得エラーです: 「はタイプ 『System.ServiceModel.FaultException』の例外がEMSDataServices.dllで発生したが、ユーザーコードで処理されなかった」サービスメソッドが例外を渡さないのはなぜ

クライアント。

+0

public int insertLocation (string name) { try { dataconnection.insertStatements(cmd); } catch { throw; // Here i'm getting error } } 

は、これと同じですか? –

+0

@BJMyers私はコードでそれを言及しました – Mohsin

答えて

1

見つけました。コードに間違いはありませんでした。私はデバッグモードでサービスを実行していましたが、例外的に 'ユーザーコードが未処理の場合はブレーク'という例外設定がチェックされていましたので、サービスを停止してさらにアクションを実行し、サービスからの応答がないためクラッシュしました。

これをオフにして、期待どおりに動作します。

0

@Mohsin、insertStatementsのcatch(FaultException ex)は役に立たない。あなたの例外を捕らえることは決してありません。メソッドの外で例外をスローしているからです。再スローされたどこかの例外を処理する必要があります。これはinsertLocationメソッドで行うことができます。以下の変更コードを参照してください。

public int insertLocation(string name) 
     { 
      try 
      { 
       dataconnection.insertStatements(cmd); 
      } 
      catch (FaultException ex) 
      { 
       // you should handle the exception here. Do not retrow here too. Otherwise you may need to handle somewhere else again. 
      } 
     } 
     public int insertStatements(SqlCommand cmd) 
     { 
      try 
      { 
       //insert data to the db 

      } 
      catch (SqlException ex) 
      { 
       if (ex.Number == 2627) // if unique key constraint error 
       { 
        throw new FaultException("error reason", new FaultCode("Error Code: "); 
       } 
       else 
       { 
        throw new FaultException("DB error: ", new FaultCode("Error Code: "); 
       } 
      } 
     } 
+0

私はクライアントのUI層で例外を処理したいです。私はそれを投げている理由です。このエラーが発生したことを示すメッセージボックスが表示されます。 – Mohsin

+0

内部不正な例外キャッチブロックは、必要な例外の詳細を取ってメッセージボックスに表示します。これは例外処理と呼ばれます。あなたは例外を投げ捨てることはできません。 –

+0

そのcatchブロックはwcfサービス内にあります。私はクライアントに返す必要があります – Mohsin

0

///Here i'm getting the errorの行は、throwとなっています。それはまさにそれがやるべきことです。それは(それはtryの中にあるので)捕らえられた例外をとり、それが捕まえられなかったかのように、再び処理されないようにしています。

これは、例外をログに記録したり検査したりして、それをバブルアップさせたい場合に実行します。この場合、try/catch全体を削除するのとまったく同じです。

この:エラーが発生した

public int insertLocation (string name) 
{ 
    dataconnection.insertStatements(cmd); 
} 
+0

また、FaultExceptionをスローする場合は、次のドキュメントを参照してください。https://msdn.microsoft.com/en-us/library/system.servicemodel.faultexception(v=vs.110).aspx SQLからエラーコードを渡すだけでは、デバッグが難しくなります。 SqlExceptionから実際のメッセージを渡すことができます。 –

関連する問題