Latest web development tutorials

استثناء روبي

الاستثناءات والتنفيذ ترتبط دائما. إذا قمت بفتح الملف الذي لا وجود له، وليس التعامل الصحيح مع الوضع، ثم يعتبر البرنامج لتكون ذات جودة منخفضة.

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

تقدم روبي آلية مثالية لمعالجة الاستثناءات. يمكننا أن نعلق التعليمات البرمجية التي قد رمي استثناء، واستخدام بنودالإنقاذأن أقول روبي نوع مثالي من استثناء إلى أن تعالج في كتلةتبدأ / نهاية.

قواعد

begin #开始
 
 raise.. #抛出异常
 
rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException
 $! #表示异常信息
 $@ #表示异常出现的代码位置
else #其余异常
 ..
ensure #不管有没有异常,进入该代码块
 
end #结束

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

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

إذا لم تطابق اي استثناء من النوع المحدد من الخطأ، يمكننا استخدام شرطآخربعد كل بندالإنقاذ.

أمثلة

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
      file = STDIN
end
print file, "==", STDIN, "\n"

أمثلة من إخراج أعلاه قيد التشغيل. كماترون،STDIN استبدالالملف،لأنمفتوحةفشل.

#<IO:0xb7d16f84>==#<IO:0xb7d16f84>

بيان استخدامإعادة المحاولة

يمكنك استخدام كتلةالانقاذللقبض على استثناء، ومن ثم استخدام كتلة بيانإعادة المحاولةتبدأتبدأمن البداية.

قواعد

begin
    # 这段代码抛出的异常将被下面的 rescue 子句捕获
rescue
    # 这个块将捕获所有类型的异常
    retry  # 这将把控制移到 begin 的开头
end

أمثلة

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
   fname = "existant_file"
   retry
end

ما يلي هو تدفق العملية:

  • حدث استثناء عند فتحه.
  • انتقل إلى إنقاذ. fname سيتم توزيعهم.
  • انتقال إلى بداية نبدأ إعادة المحاولة.
  • يتم فتح الملف بنجاح.
  • مواصلة العملية الأساسية.

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

بيان استخدامرفع

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

قواعد

raise 

或

raise "Error Message" 

或

raise ExceptionType, "Error Message"

或

raise ExceptionType, "Error Message" condition

النموذج الأول ببساطة إعادة رمي استثناء الحالي (إذا لم يكن هناك استثناء الحالي يلقى RuntimeError). هذا وتستخدم لشرح قبل اردة استثناء استثناء معالج استثناء.

النموذج الثاني يخلق استثناءRuntimeErrorالجديد، وتحديد رسالتها إلى سلسلة معينة. بعد المكالمة كومة لرمي استثناء.

وهناك شكل ثالث من المعلمة الأولى لإنشاء استثناء، ثم تعيين الرسائل ذات الصلة كمعلمة الثاني.

الصف الرابع والشكل الثالث مشابه، يمكنك إضافة أي عبارات شرطية إضافية (على سبيل المثالإلا)لرمي استثناء.

أمثلة

#!/usr/bin/ruby

begin  
    puts 'I am before the raise.'  
    raise 'An error has occurred.'  
    puts 'I am after the raise.'  
rescue  
    puts 'I am rescued.'  
end  
puts 'I am after the begin block.'  

تشغيل إخراج المثال أعلاه هو:

I am before the raise.  
I am rescued.  
I am after the begin block.  

آخر مظاهرةرفعأمثلة الاستخدام:

#!/usr/bin/ruby

begin  
  raise 'A test exception.'  
rescue Exception => e  
  puts e.message  
  puts e.backtrace.inspect  
end  

تشغيل إخراج المثال أعلاه هو:

A test exception.
["main.rb:4"]

ضماناستخدام البيانات

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

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

قواعد

begin 
   #.. 过程
   #.. 抛出异常
rescue 
   #.. 处理错误 
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

أمثلة

begin
  raise 'A test exception.'
rescue Exception => e
  puts e.message
  puts e.backtrace.inspect
ensure
  puts "Ensuring execution"
end

تشغيل إخراج المثال أعلاه هو:

A test exception.
["main.rb:4"]
Ensuring execution

باستخدام عباراتشيء آخر

إذا تم توفير شرطآخر،يتم وضعه عادة بعد شرطالإنقاذ،قبلالتأكد من وجودها.

يتم تنفيذ بند الجسمآخرفقط عندما يكون الجسم من التعليمات البرمجية دون رمي استثناء.

قواعد

begin 
   #.. 过程 
   #.. 抛出异常
rescue 
   #.. 处理错误
else
   #.. 如果没有异常则执行
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

أمثلة

begin
 # 抛出 'A test exception.'
 puts "I'm not raising exception"
rescue Exception => e
  puts e.message
  puts e.backtrace.inspect
else
   puts "Congratulations-- no errors!"
ensure
  puts "Ensuring execution"
end

تشغيل إخراج المثال أعلاه هو:

I'm not raising exception
Congratulations-- no errors!
Ensuring execution

استخدام $! متغير يمكن أن يصاب رسالة خطأ القيت.

التقاط ورمي

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

ويعرفالصيداسم معين (قد يكون رمز أو سلسلة) التسمية ككتلة. يتم تنفيذ كتلة تعرف عادة لقاءات رمي.

قواعد

throw :lablename
#.. 这不会被执行
catch :lablename do
#.. 在遇到一个 throw 后匹配将被执行的 catch
end

或

throw :lablename condition
#.. 这不会被执行
catch :lablename do
#.. 在遇到一个 throw 后匹配将被执行的 catch
end

أمثلة

في المثال التالي، إذا كان المستخدم بكتابة '! لرد على أي موجه، واستخدام رمي لإنهاء التفاعل مع المستخدم.

def promptAndGet(prompt)
   print prompt
   res = readline.chomp
   throw :quitRequested if res == "!"
   return res
end

catch :quitRequested do
   name = promptAndGet("Name: ")
   age = promptAndGet("Age: ")
   sex = promptAndGet("Sex: ")
   # ..
   # 处理信息
end
promptAndGet("Name:")

يتطلب البرنامج المذكور أعلاه التفاعل البشري، يمكنك أن تجرب على جهاز الكمبيوتر الخاص بك. تشغيل إخراج المثال أعلاه هو:

Name: Ruby on Rails
Age: 3
Sex: !
Name:Just Ruby

الطبقة استثناء

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

  • المقاطعة
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit

قاتلة هي طبقة من استثناء آخر، ولكن المترجم روبي استخدامها داخليا فقط.

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

دعونا ننظر إلى مثال على ذلك:

class FileSaveError < StandardError
   attr_reader :reason
   def initialize(reason)
      @reason = reason
   end
end

الآن، أن ننظر في المثال التالي سوف تستخدم في الاستثناءات المذكورة أعلاه:

File.open(path, "w") do |file|
begin
    # 写出数据 ...
rescue
    # 发生错误
    raise FileSaveError.new($!)
end
end

هنا، الخط الأكثر أهمية هورفعFileSaveError.new ($!). ونحن ندعو رفع تخطيطي حدث استثناء، مرت مثيل جديد FileSaveError بسبب تشوهات معينة الناجمة عن البيانات فشل الكتابة.