2016-11-30 8 views
0

である場合にのみ、私は三部構成のアプリケーション(CATIA V5)でオブジェクトを更新し、私のC#のヘルパーライブラリの次の機能を持たせてコードを実行します。それは避けられないC#トライキャッチ最終的に例外が未処理

public void Update(INFITF.AnyObject objectToUpdate) 
    { 
     try 
     { 
      Part.UpdateObject(objectToUpdate); 
     } 
     catch 
     { 
      throw new InvalidOperationException("Update Failed"); 
     } 
     finally 
     { 
      Part.Inactivate(objectToUpdate); 
     } 
    } 

Part.UpdateObject()が失敗することがあります。

これが失敗した場合、関数のユーザーに更新が失敗したことを通知し、問題をカスタム方法で修正して例外を処理したり、例外をデフォルトの安定した方法。

例外が未処理の場合はfinallyブロックが呼び出されないため、私が掲載したコードはうまくいかないことがわかりました...しかし、うまくいけばコードブロックがアイデアを得ることを願っています。

UPDATE:

私は十分によく私のシナリオを説明していないので、私は明確にしましょう。私は、他の人が開発するときにこの機能を使用しています。これらのプログラマーの中には、try/catchブロックの使い方や、そうでないものがあります。関数を呼び出すことができる2つのサンプルシナリオを次に示します。

A.ユーザーはtry/catchブロックに精通しており、なぜ更新呼び出しが失敗する可能性があるかを認識しています。

​​

B.ユーザーは更新が私たちが作る安定した方法で失敗した更新を処理するこのシナリオでは

Update(objectToUpdate) 

を失敗する可能性のtry/catchブロックに精通していないか、認識していません初心者プログラマーに感謝し、アプリケーションがクラッシュするのを防ぎます。 (この場合、サードパーティのCADソフトウェアで問題のオブジェクトを無効にする)

+0

私はキャッチにイベントを発生させる代わりに、再び投げ検討したいです。または、クライアントにリトライロジックを処理させます。 – axlj

+3

[例外がスローされたかどうかに関係なく、finallyブロックは常に実行されます。](https://msdn.microsoft.com/en-us/library/ke0zf0f5(v = vs.110).aspx) –

+0

ここに表示されます:https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx例外が処理されていない場合にfinallyブロックが実行されないのは、try-finallyブロックのみでtrue try-catch-finallyブロックではtrueです? – Eric

答えて

0

未処理の例外は、呼び出しルーチンによって処理されない、つまりコードのどの部分でも捕捉されない例外です。あなたのケースでは、ハードウェア、ドライバ、デバイスまたはメモリに関係するもの以外のすべての例外がキャッチされます。その場合、アプリケーションはOSによって終了されます。あなたはあまりそれについて行うことはできません。 AppDomain UnhandledExceptionハンドラを作成して、アプリケーションのシャットダウンに関する情報を取得しようとすることがありますが、OSがアプリケーションを終了させた場合には必ずしも機能しないことがあります。

+0

この答えは、例外が処理された場合にfinallyコードを実行しない方法を提供しません。 – Eric

0

ディスカッションは、特にフラグのアイデアに役立っています。私はHandledExceptionクラスを作成し

まず:

[Serializable()] 
public class HandledException : Exception 
{ 
    public bool Handled { get; set; } 

    public HandledException(string Message) 
     : base(Message) 
    { 

    } 
} 

次のように私はそれからであることを私の更新方法を変更:

をそれは言った、フラグが私の解決策であるので、ここでは、呼び出し元のコードから操作する必要があります
[DebuggerHidden] 
public void Update(INFITF.AnyObject objectToUpdate) 
{ 
    HandledException ex = new HandledException("Update Failed"); 
    bool updateSuccesful = false; 
    try 
    { 
     Part.UpdateObject(objectToUpdate); 
     updateSuccesful = true; 
    } 
    catch 
    { 
     throw ex; 
    } 
    finally 
    { 
     if (!updateSuccesful && !ex.Handled) 
     { 
      if(!Part.IsUpToDate(objectToUpdate)) 
       Part.Inactivate(objectToUpdate); 
     } 
    } 
} 

これは、更新が失敗した場合にのみCADオブジェクトを非アクティブ化し、呼び出しコードが例外を処理してオブジェクトの不活性化を防ぐことを許可します。

ユーザーが失敗した更新を処理しない場合、問題は安定した方法で処理されます。

使用例:

try 
{ 
    partDoc.Update(pad); 
} 
catch (HandledException ex) 
{ 
    //I want the pad to be deactivated so I continue with the default behavior 
    //in some scenarios I would fix the pad and mark the exception handled 
    ex.Handled = false; 
    string currentName = currentBody.get_Name(); 
    currentBody.set_Name(currentName + "_PadError"); 
} 

は時々あなただけの問題を通して話をする必要があり、議論をありがとう:)