---
title: "استبدال رمز الخطأ باستثناء"
type: "refactoring-technique"
slug: "replace-error-code-with-exception"
url: "http://localhost:3000/ar/replace-error-code-with-exception.md"
category: "تبسيط استدعاءات الدوال"
description: "المشكلة: دالة تعيد قيمة خاصة تشير إلى وجود خطأ؟ الحل: قم برمي استثناء (exception) بدلاً من ذلك."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# استبدال رمز الخطأ باستثناء

> المشكلة: دالة تعيد قيمة خاصة تشير إلى وجود خطأ؟ الحل: قم برمي استثناء بدلاً من ذلك.

## المشكلة

دالة تعيد قيمة خاصة تشير إلى وجود خطأ؟

## الحل

قم برمي استثناء بدلاً من ذلك.

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

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

## الفوائد

* يخلص الكود من عدد كبير من الجمل الشرطية للتحقق من رموز الأخطاء المختلفة. معالجات الاستثناءات هي طريقة أكثر إيجازًا للتمييز بين مسارات التنفيذ العادية وغير العادية.
* يمكن لفئات الاستثناءات تنفيذ دوالها الخاصة، وبالتالي تحتوي على جزء من وظائف معالجة الأخطاء (مثل إرسال رسائل الخطأ).
* على عكس الاستثناءات، لا يمكن استخدام رموز الأخطاء في الباني، لأن الباني يجب أن يعيد فقط كائنًا جديدًا.

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

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

1. ابحث عن جميع الاستدعاءات لدالة تعيد رموز أخطاء، وبدلاً من التحقق من رمز الخطأ، قم بتغليفها بكتل `try`/`catch`.
2. داخل الدالة، بدلاً من إرجاع رمز الخطأ، ارمِ استثناءً.
3. قم بتغيير توقيع الدالة بحيث يحتوي على معلومات حول الاستثناء الذي يتم رميه (قسم `@throws`).
## Code Examples

### java

```java
// Before
int withdraw(int amount) {
  if (amount > _balance) {
    return -1;
  }
  else {
    balance -= amount;
    return 0;
  }
}

// After
void withdraw(int amount) throws BalanceException {
  if (amount > _balance) {
    throw new BalanceException();
  }
  balance -= amount;
}
```

### csharp

```csharp
// Before
int Withdraw(int amount) 
{
  if (amount > _balance) 
  {
    return -1;
  }
  else 
  {
    balance -= amount;
    return 0;
  }
}

// After
///<exception cref="BalanceException">يُطرح عندما يكون amount > _balance</exception>
void Withdraw(int amount)
{
  if (amount > _balance) 
  {
    throw new BalanceException();
  }
  balance -= amount;
}
```

### php

```php
// Before
function withdraw($amount) {
  if ($amount > $this->balance) {
    return -1;
  } else {
    $this->balance -= $amount;
    return 0;
  }
}

// After
function withdraw($amount) {
  if ($amount > $this->balance) {
    throw new BalanceException;
  }
  $this->balance -= $amount;
}
```

### python

```python
// Before
def withdraw(self, amount):
    if amount > self.balance:
        return -1
    else:
        self.balance -= amount
    return 0

// After
def withdraw(self, amount):
    if amount > self.balance:
        raise BalanceException()
    self.balance -= amount
```

### typescript

```typescript
// Before
withdraw(amount: number): number {
  if (amount > _balance) {
    return -1;
  }
  else {
    balance -= amount;
    return 0;
  }
}

// After
withdraw(amount: number): void {
  if (amount > _balance) {
    throw new Error();
  }
  balance -= amount;
}
```

