---
title: "استبدال الاستثناء باختبار شرطي"
type: "refactoring-technique"
slug: "replace-exception-with-test"
url: "http://localhost:3000/ar/replace-exception-with-test.md"
category: "تبسيط استدعاءات الدوال"
description: "المشكلة: تقوم برمي استثناء في مكان يمكن لاختبار بسيط فيه القيام بالمهمة؟ الحل: استبدل الاستثناء باختبار شرطي."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# استبدال الاستثناء باختبار شرطي

> المشكلة: تقوم برمي استثناء في مكان يمكن لاختبار بسيط فيه القيام بالمهمة؟ الحل: استبدل الاستثناء باختبار شرطي.

## المشكلة

تقوم برمي استثناء في مكان يمكن لاختبار بسيط فيه القيام بالمهمة؟

## الحل

استبدل الاستثناء باختبار شرطي.

## لماذا نقوم بإعادة الهيكلة

يجب استخدام الاستثناءات لمعالجة السلوك غير المنتظم المرتبط بخطأ غير متوقع. ولا ينبغي أن تعمل كبديل للاختبار. إذا كان من الممكن تجنب الاستثناء ببساطة عن طريق التحقق من الشرط قبل التشغيل، فافعل ذلك. يجب حجز الاستثناءات للأخطاء الحقيقية.

على سبيل المثال، دخلت حقل ألغام وقمت بتفجير لغم هناك، مما أدى إلى حدوث استثناء؛ تم التعامل مع الاستثناء بنجاح وتم نقلك جواً إلى بر الأمان خارج حقل الألغام. ولكن كان بإمكانك تجنب كل هذا ببساطة عن طريق قراءة لافتة التحذير الموجودة أمام حقل الألغام في المقام الأول.

## الفوائد

* يمكن أن تكون الجملة الشرطية البسيطة في بعض الأحيان أكثر وضوحًا من كود معالجة الاستثناءات.

## كيفية إعادة الهيكلة

1. أنشئ جملة شرطية للحالة الاستثنائية وانقلها قبل كتلة try/catch.
2. انقل الكود من قسم `catch` إلى داخل هذه الجملة الشرطية.
3. في قسم `catch`، ضع الكود الخاص برمي استثناء عادي غير مسمى وقم بتشغيل جميع الاختبارات.
4. إذا لم يتم رمي أي استثناءات أثناء الاختبارات، فتخلص من عامل `try`/`catch`.
## Relations

**Similar techniques**

- [استبدال رمز الخطأ باستثناء](/ar/replace-error-code-with-exception.md)

## Code Examples

### java

```java
// Before
double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}

// After
double getValueForPeriod(int periodNumber) {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}
```

### csharp

```csharp
// Before
double GetValueForPeriod(int periodNumber) 
{
  try 
  {
    return values[periodNumber];
  } 
  catch (IndexOutOfRangeException e) 
  {
    return 0;
  }
}

// After
double GetValueForPeriod(int periodNumber) 
{
  if (periodNumber >= values.Length) 
  {
    return 0;
  }
  return values[periodNumber];
}
```

### php

```php
// Before
function getValueForPeriod($periodNumber) {
  try {
    return $this->values[$periodNumber];
  } catch (ArrayIndexOutOfBoundsException $e) {
    return 0;
  }
}

// After
function getValueForPeriod($periodNumber) {
  if ($periodNumber >= count($this->values)) {
    return 0;
  }
  return $this->values[$periodNumber];
}
```

### python

```python
// Before
def getValueForPeriod(periodNumber):
    try:
        return values[periodNumber]
    except IndexError:
        return 0

// After
def getValueForPeriod(self, periodNumber):
    if periodNumber >= len(self.values):
        return 0
    return self.values[periodNumber]
```

### typescript

```typescript
// Before
getValueForPeriod(periodNumber: number): number {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}

// After
getValueForPeriod(periodNumber: number): number {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}
```

