الفرق بين المراجعتين لصفحة: «Ruby/exceptions»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
| (2 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
| سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:معالجة الاستثناءات في روبي}}</noinclude> | |||
يتمّ التعامل مع الاستثناءات بعد | يتمّ التعامل مع الاستثناءات بعد الكلمة <code>rescue</code> في الكتلة <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|begin/end]]</code>: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
begin | begin | ||
| سطر 8: | سطر 8: | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
إذا كنت ضمن | إذا كنت ضمن تابع، فلست بحاجة لاستخدام <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|begin]]</code> و <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|end]]</code> إلا إذا كنت ترغب بحدّ النّطاق الخاص بالاستثناء الذي ترغب بمعالجته: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
def my_method | def my_method | ||
| سطر 16: | سطر 16: | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
نفس الأمر يطبّق في الأصناف (classes) | نفس الأمر يطبّق في [[:تصنيف:Ruby Class|الأصناف]] (classes) و<nowiki/>[[:تصنيف:Ruby Module|الوحدات]] (modules). | ||
يمكنك إسناد استثناء إلى متغيّر محليّ باستخدام الرمز => متبوعًا باسم المتغيّر، وذلك في نهاية السطر الخاص بالكلمة rescue: | يمكنك إسناد استثناء إلى متغيّر محليّ باستخدام الرمز <code>=></code> متبوعًا باسم المتغيّر، وذلك في نهاية السطر الخاص بالكلمة <code>rescue</code>: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
begin | begin | ||
| سطر 27: | سطر 27: | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
في الوضع | في الوضع الافتراضيّ، فإنّ الاستثناءات من النوع <code>[[Ruby/StandardError|StandardError]]</code> والأصناف المتفرعّة عنها يتم التعامل معها باستخدام <code>rescue</code>؛ لكنّك إن رغبت بحصر استثناءات معيّنة (والأصناف الفرعية التابعة لها) لتعالجها على وجه التحديد، فيمكنك ذكرها ضمن قائمة بعد كلمة <code>rescue</code>: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
begin | begin | ||
# ... | # ... | ||
rescue ArgumentError, NameError | rescue ArgumentError, NameError | ||
# التعامل مع الاستثناءات من | # NameError أو ArgumentError التعامل مع الاستثناءات من النوع | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| سطر 40: | سطر 40: | ||
# ... | # ... | ||
rescue ArgumentError | rescue ArgumentError | ||
# التعامل مع الاستثناء من نوع | # ArgumentError التعامل مع الاستثناء من نوع | ||
rescue NameError | rescue NameError | ||
# التعامل مع الاستثناء من | # NameError التعامل مع الاستثناء من نوع | ||
rescue | rescue | ||
# التعامل مع أي استثناء آخر يندرج تحت | # StandardError التعامل مع أي استثناء آخر يندرج تحت | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
تتم مطابقة الاستثناءات في قسم rescue ابتداءً | تتم مطابقة الاستثناءات في قسم <code>rescue</code> ابتداءً من الأعلى، وتطابق استثناءً واحدًا فقط. فإذا ظهر استثناء <code>[[Ruby/ArgumentError|ArgumentError]]</code> في الجزء <code>begin</code>، فلن يتمّ التعامل معه في الجزء <code>[[Ruby/StandardError|StandardError]]</code>. | ||
يمكنك إعادة تنفيذ الجزء الذي ظهر فيه الاستثناء باستخدام retry: | يمكنك إعادة تنفيذ الجزء الذي ظهر فيه الاستثناء باستخدام <code>retry</code>: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
begin | begin | ||
# ... | # ... | ||
rescue | rescue | ||
# | # begin افعل شيئًا يمكنه تغيير نتيجة الجزء الخاص بـ | ||
retry | retry | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
وعندها سيستمرّ التنفيذ من بداية كتلة | وعندها سيستمرّ التنفيذ من بداية كتلة <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|begin]]</code>، لذلك احذر من أن تكوّن حلقات تكرار لا نهائيّة. | ||
كتلة rescue هي المكان الوحيد الصّحيح لإجراء إعادة المحاولة باستخدام retry ، وأيّ مكان آخر تستخدمها فيه سيسبب ظهور SyntaxError. لكنّك إن أردت إعادة تنفيذ كتلة معيّنة فعليك استخدام redo. انظر القسم الخاص ببنى التحكم لمزيد من التفاصيل. | كتلة <code>rescue</code> هي المكان الوحيد الصّحيح لإجراء إعادة المحاولة باستخدام <code>retry</code> ، وأيّ مكان آخر تستخدمها فيه سيسبب ظهور <code>[[Ruby/SyntaxError|SyntaxError]]</code>. لكنّك إن أردت إعادة تنفيذ كتلة معيّنة فعليك استخدام <code>redo</code>. انظر القسم الخاص ببنى التحكم لمزيد من التفاصيل. | ||
إذا أردت أن تتأكد من تنفيذ جزء من الشيفرة سواءً تسبب بحدوث استثناء أو لا، فعليك | إذا أردت أن تتأكد من تنفيذ جزء من الشيفرة سواءً تسبب بحدوث استثناء أو لا، فعليك عندئذٍ أن تستخدم <code>ensure</code>: | ||
<syntaxhighlight lang="ruby"> | <syntaxhighlight lang="ruby"> | ||
begin | begin | ||
| سطر 88: | سطر 87: | ||
== المصادر == | == المصادر == | ||
* [https://ruby-doc.org/core-2.5.1/doc/syntax/exceptions_rdoc.html صفحة Exceptions في توثيق روبي الرسمي.] | * [https://ruby-doc.org/core-2.5.1/doc/syntax/exceptions_rdoc.html صفحة Exceptions في توثيق روبي الرسمي.] | ||
[[تصنيف: Ruby]] | |||
[[تصنيف: Ruby Syntax]] | |||
المراجعة الحالية بتاريخ 08:45، 19 نوفمبر 2018
يتمّ التعامل مع الاستثناءات بعد الكلمة rescue في الكتلة begin/end:
begin
# الشيفرة التي قد تسبب ظهور استثناء برمجي
rescue
# معالجة الاستثناء
end
إذا كنت ضمن تابع، فلست بحاجة لاستخدام begin و end إلا إذا كنت ترغب بحدّ النّطاق الخاص بالاستثناء الذي ترغب بمعالجته:
def my_method
# ...
rescue
# ...
end
نفس الأمر يطبّق في الأصناف (classes) والوحدات (modules).
يمكنك إسناد استثناء إلى متغيّر محليّ باستخدام الرمز => متبوعًا باسم المتغيّر، وذلك في نهاية السطر الخاص بالكلمة rescue:
begin
# ...
rescue => exception
warn exception.message
raise # كرر ظهور الاستثناء
end
في الوضع الافتراضيّ، فإنّ الاستثناءات من النوع StandardError والأصناف المتفرعّة عنها يتم التعامل معها باستخدام rescue؛ لكنّك إن رغبت بحصر استثناءات معيّنة (والأصناف الفرعية التابعة لها) لتعالجها على وجه التحديد، فيمكنك ذكرها ضمن قائمة بعد كلمة rescue:
begin
# ...
rescue ArgumentError, NameError
# NameError أو ArgumentError التعامل مع الاستثناءات من النوع
end
كما يمكنك التعامل مع الاستثناءات المختلفة بأساليب مختلفة:
begin
# ...
rescue ArgumentError
# ArgumentError التعامل مع الاستثناء من نوع
rescue NameError
# NameError التعامل مع الاستثناء من نوع
rescue
# StandardError التعامل مع أي استثناء آخر يندرج تحت
end
تتم مطابقة الاستثناءات في قسم rescue ابتداءً من الأعلى، وتطابق استثناءً واحدًا فقط. فإذا ظهر استثناء ArgumentError في الجزء begin، فلن يتمّ التعامل معه في الجزء StandardError.
يمكنك إعادة تنفيذ الجزء الذي ظهر فيه الاستثناء باستخدام retry:
begin
# ...
rescue
# begin افعل شيئًا يمكنه تغيير نتيجة الجزء الخاص بـ
retry
end
وعندها سيستمرّ التنفيذ من بداية كتلة begin، لذلك احذر من أن تكوّن حلقات تكرار لا نهائيّة.
كتلة rescue هي المكان الوحيد الصّحيح لإجراء إعادة المحاولة باستخدام retry ، وأيّ مكان آخر تستخدمها فيه سيسبب ظهور SyntaxError. لكنّك إن أردت إعادة تنفيذ كتلة معيّنة فعليك استخدام redo. انظر القسم الخاص ببنى التحكم لمزيد من التفاصيل.
إذا أردت أن تتأكد من تنفيذ جزء من الشيفرة سواءً تسبب بحدوث استثناء أو لا، فعليك عندئذٍ أن تستخدم ensure:
begin
# ...
rescue
# ...
ensure
# هذا سينفذ دومًا
end
وقد ترغب أحيانًا بتنفيذ أوامر معيّنة فقط في حال لم يظهر أي استثناء:
begin
# ...
rescue
# ...
else
# هذا ينفذ فقط في حالة عدم ظهور أيّ استثناء
ensure
# ...
end