Clean Code:エラー処理



簡潔なエラー処理により、クリーンなコードが生成されます.

1.Try-CatchからFinally文へ


  • 異常が発生するコードの場合はtry-catch-finally文から始めたほうがいいです.

  • try-catch構造を使用して範囲を定義し、残りの論理をTDDで追加します.

  • まず、異常なテストケースを強制的に作成し、テストによってコードを記述し、tryブロックのトランザクション範囲から自然に実施することで、トランザクションの本質を維持しやすくなります.
  • 2.unchecked例外の使用


  • 収益がchecked例外の使用より大きい場合にのみ使用します.

  • 子ステップメソッドに例外を追加する場合は、すべての親ステップメソッドに例外を定義する必要があります.

  • これは開放−閉鎖の原則に反し,カプセル化を破った.
  • 3.呼び出し元の例外クラスを定義する


  • エラーを定義する際に最も重要なポイントは、エラーを見つける方法です.

  • 例外に対応する方法が例外タイプとは無関係である場合、パッケージクラスを使用して1つの例外タイプのみを返すことができます.
  • LocalPort port = new LocalPort(12)
    try{
      port.open();
    } catch (PortDeviceFailure e) {
      reportError(e)
      logger.log(e.getMessage(), e);
    } finally {
    ...
    }
    
    public class LocalPort {
      private ACMEPort innerPort;
      
      pblice LocalPort(int portNumber) {
        innerPort = new ACMEPort(portNumber);
      }
      
      public void open() {
        try {
          innerPort.open()
        } catch (DeviceResponseException e) {
          throw new PortDeviceFailure(e);
        } catch (ATM1212UnlockedException e) {
          throw new PortDeviceFailure(e);
        } catch (GMXError e) {
          throw new PortDeviceFailure(e);
        }
      }
      ...
    }
  • 外部ライブラリACMEPortクラスをLocalPortクラスにカプセル化すると依存性が低下し、他のライブラリに移行してもコストが低下します.また、特定のプログラムの設計方法には影響しません.
  • 4.通常フローの定義

  • 特殊ケースモードにより、クラス/オブジェクトを異常にカプセル化して処理し、異常処理を行わない場合があります.
  • // Before
    try {
      MealExpenses expenses = ExpenseReportDAO.getMeals(employee.getID());
      m_total += expenses.getTotal();
    } catch (MealExpenseNotFound e) {
      m_total += getMealPerDiem();
    }
    
    // After
    MealExpenses expenses = ExpenseReportDAO.getMeals(employee.getID());
    m_total += expenses.getTotal();
    
    public class PerDiemExpenses implements MealExpenses {
      public int getTotal() {
        // 기본값으로 일일 식비를 반환
      }
    }
    修復
  • ExpenseReportDAOは、常にMealExpenseオブジェクトを返し、要求された食事代がなければ毎日の基本食事代のMealExpenseオブジェクトを返します.
  • 5.nullに戻らない


  • nullを返すコードは、問題を呼び出し元に転嫁します.

  • nullの確認が多すぎる場合は、例外を投げ出すか、特殊な事例オブジェクトに戻るように変換します.

  • 外部APIがnullを返す場合、パッケージメソッドは、例外を放出するか、または特殊な事例オブジェクトを返すために実装される.
  • 6.nullを渡さない


  • APIが通常の引数nullを使用することを望んでいない限り、メソッド引数を使用してnullを渡すことは避けられます.

  • ほとんどのプログラミング言語では、呼び出し者が誤って伝達したnullを処理するのに適切な方法がないため、ポリシー伝達nullを許可することは合理的ではない.