الفرق بين المراجعتين لصفحة: «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