الفرق بين المراجعتين ل"Ruby/exceptions"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (تصحيح تنسيق العنوان)
ط
 
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
= معالجة الاستثناءات في لغة روبي =
+
<noinclude>{{DISPLAYTITLE:معالجة الاستثناءات في روبي}}</noinclude>
يتمّ التعامل مع الاستثناءات بعد كلمة rescue في كتلة begin/end:
+
يتمّ التعامل مع الاستثناءات بعد الكلمة <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>
إذا كنت ضمن تابع فلست بحاجة لاستخدام begin و end إلا إذا كنت ترغب بحدّ النّطاق الخاص بالاستثناء الذي ترغب بمعالجته:
+
إذا كنت ضمن تابع، فلست بحاجة لاستخدام <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) والوحدات  (modules)
+
نفس الأمر يطبّق في [[:تصنيف:Ruby Class|الأصناف]] (classes) و<nowiki/>[[:تصنيف:Ruby Module|الوحدات]] (modules).
يمكنك إسناد استثناء إلى متغيّر محليّ باستخدام الرمز ‎=>‎ متبوعًا باسم المتغيّر، وذلك في نهاية السطر الخاص بالكلمة rescue:
+
 
 +
يمكنك إسناد استثناء إلى متغيّر محليّ باستخدام الرمز ‎<code>=></code>‎ متبوعًا باسم المتغيّر، وذلك في نهاية السطر الخاص بالكلمة <code>rescue</code>:
 
<syntaxhighlight lang="ruby">
 
<syntaxhighlight lang="ruby">
 
begin
 
begin
سطر 26: سطر 27:
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
في الوضع الافتراضيّ فإنّ الاستثناءات من نوع StandardError والأصناف المتفرعّة عنها يتم التعامل معها باستخدام rescue، لكنّك إن رغبت بحصر استثناءات معيّنة (والأصناف  الفرعية التابعة لها) لتعالجها على وجه التحديد، فيمكنك ذكرها ضمن قائمة بعد كلمة rescue:
+
في الوضع الافتراضيّ، فإنّ الاستثناءات من النوع <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
 # التعامل مع الاستثناءات من نوع ArgumentError أو NameError
+
 # NameError أو ArgumentError التعامل مع الاستثناءات من النوع
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
سطر 39: سطر 40:
 
 # ...
 
 # ...
 
rescue ArgumentError
 
rescue ArgumentError
 # التعامل مع الاستثناء من نوع ArgumentError
+
 # ArgumentError التعامل مع الاستثناء من نوع  
 
rescue NameError
 
rescue NameError
 # التعامل مع الاستثناء من نوعNameError
+
 # NameError التعامل مع الاستثناء من نوع
 
rescue
 
rescue
 # التعامل مع أي استثناء آخر يندرج تحت StandardError
+
 # StandardError التعامل مع أي استثناء آخر يندرج تحت  
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
تتم مطابقة الاستثناءات في قسم rescue ابتداءً  من الأعلى، وتطابق استثناءً واحدًا فقط. فإذا ظهر استثناء ArgumentError في جزء begin لن يتمّ التعامل معه في جزء StandardError.
+
تتم مطابقة الاستثناءات في قسم <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
 # do something that may change the result of the begin block
+
 # begin افعل شيئًا يمكنه تغيير نتيجة الجزء الخاص بـ  
 # افعل شيئًا يمكنه تغيير نتيجة الجزء الخاص بـ begin
 
 
 retry
 
 retry
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
وعندها سيستمرّ التنفيذ من بداية كتلة begin، لذلك احذر من أن تكوّن حلقات تكرار لا نهائيّة.
+
وعندها سيستمرّ التنفيذ من بداية كتلة <code>[[Ruby/miscellaneous#BEGIN .D9.88 END|begin]]</code>، لذلك احذر من أن تكوّن حلقات تكرار لا نهائيّة.
كتلة rescue هي المكان الوحيد الصّحيح لإجراء إعادة المحاولة باستخدام retry ، وأيّ مكان آخر تستخدمها فيه سيسبب ظهور SyntaxError. لكنّك إن أردت إعادة تنفيذ كتلة معيّنة فعليك استخدام redo. انظر القسم الخاص ببنى التحكم لمزيد من التفاصيل.
+
 
إذا أردت أن تتأكد من تنفيذ جزء من الشيفرة سواءً تسبب بحدوث استثناء أو لا، فعليك عندئذ أن تستخدم ensure:
+
كتلة <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
سطر 81: سطر 84:
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
== المصادر ==
 +
* [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

المصادر