問題は次のとおりです。
フォームのすべてのブロックを検索します。
try { ... }
catch (Exception e) { ... }
と
try { ... }
catch ( T1 e ) { ... }
....
catch ( Tn e ) { ... }
すべてのT1、... Tn e、コード変更を実行できるプログラム変換システム、およびスローされた例外についての理由は、解決策のようです。
Javaフロントエンドを備えたDMSソフトウェアリエンジニアリングツールキットがこれを行う可能性があります。
メインブロック内からスローされた一連の例外を計算できるアナライザーが必要です。これらの例外をオブジェクト階層に従って分類することもできます。TmがTnの特殊化である場合、ネストされた試行としてTmおよびTnのハンドラーを生成することができます。DMSは完全な型分析を備えているため、コード内の型を判別し、コードブロックによってスローされます。例外のオブジェクト階層を計算するには、カスタムDMSコードを作成する必要があります。
コールグラフが必要なので、コールグラフで見つかった例外をtryサイトに伝播できます。それはありますが、Java1.7ではいくつかの作業が必要です。
コードを改訂するには、変換アプライヤーが必要です。一般的なケースを処理するには、連鎖キャッチについて心配する必要があると思います。DMSを使用すると、次のようになります。
rule specialize_catch(b_try: block,
E: qualifed_identifer, e: IDENTIFIER, b_recover: block,
c_pre: catches, c_post: catches):
statement -> statement
" try { \b_try }
\c_pre
catch ( \E \e ) { \b_recover }
\c_post "
->
" try { \b_try }
\c_pre
catch ( \least_specialized\(\E\,\b_try\,\c_pre\) \e ) { \b_recover }
catch ( \E e ) { \b_recover }
\c_post "
if exists_specialized_exception(E,b_try,c_pre);
変換される構文は、* meta * quotes "..."のコードであり、書き換えルールの構文から分離します。書き換えルールにはいくつかの部分があります。名前を指定します(多くの場合、数百になります)。これは、ターゲット言語(この場合はJava)で特定の名前付き構文形式を表し、メタクオーツおよびエスケープ(バックスラッシュ)形式以外の裸の形式で記述された名前付きプレースホルダー(b_try、E、b_recover、...)のセットを提供します。メタクオーツの内部。c_preは、一連のcatchコンストラクトの名前です。これを行うことができるのは、「キャッチ」が抽象で連想リストを形成するためであり、c_postについても同様です。これは、カスタムDMS機構を呼び出して結果(ブール値または新しい構文[ツリー])を計算できるメタ関数呼び出し(たとえば、least_specialized、exists_specialized_exception)を提供します。君' メタ関数呼び出しのleast_specializedには、Java言語の一部ではないため、メタ関数呼び出しの構文(コンマや括弧など)がエスケープされていることに注意してください。Javaコードの外部では、このようなメタ関数呼び出しはエスケープする必要はありません。そして最も重要なのは、左側(「これに一致」、メタ変数をバインド)と右側(ルール条件が真の場合は「これで置換」)があることです。
メタ関数least_specializedとexists_specializedは、メインコードブロックb_tryがスローする可能性のある例外、既存のキャッチc_preによって処理される例外、現在の例外タイプE、c_preより上およびEより下の最も一般的な例外、および新しいキャッチを計算します。ブロックが挿入されます。存在しない場合、ifは失敗し、例外の挿入は行われません。複製されたb_recoverブロックのクローンを削除するために、追加の変換が必要になる場合があります。
私は明らかにこれを実装しておらず、完全に考え抜いていない可能性があります。しかし、私はこれを可能な解決策への道として見ることができます。YMMV。
700のインスタンスの場合、DMSでこれを行うのはおそらくかなり限界です。個人的に1つあたり10分(編集、コンパイル、おっと...)かかった場合、それは7000分または~~ 100時間、約2週間です。これをこれほど速く実行するようにDMSを構成できるとは思えません。特に、これまでに実行したことがない場合はなおさらです。(私の会社には専門家のDMSユーザーがいますが、これは実行可能な時間枠である可能性があります)。
しかし、主張は、ツールが存在する可能性が高いということです。