Next Previous Contents

6. Noen nødvendigheter...

6.1 Exceptions: Feil og unntak. Når ting går galt.

For all sin glitrende magi, kan ikke Ruby beskytte deg fra å gjøre feil og heller ikke fra alt som kan gå galt.

  1| $gardister = true
  2| 
  3| def hent_kongen
  4|   raise SecurityError, "Området er usikret." unless $gardister 
  5|   puts "Kanskje kommer Kongen..."
  6| end
  7| 
  8| begin
  9|   hent_kongen          #=> "Kanskje kommer Kongen..."
 10|   $gardister = false
 11|   hent_kongen          #=> "Negativt: Området er usikret."
 12| rescue SecurityError => error
 13|   puts "Negativt: #{error}"
 14| end

Du kan også legge til en ensure-klausul som kjøres uansett om det heves et unntak eller ikke.

  1| begin
  2|   kode_som_kaster_unntak
  3| rescue SecurityError => error
  4|   puts "Sikkerhetsproblem: #{error}"
  5| rescue 
  6|   puts "En eller annen StandardError."
  7| ensure
  8|   puts "Opprydning gjøres okke som."
  9| end

6.2 Regulære uttrykk

Regulære uttrykk (regular expressions) er en gjenganger blant skriptingsspråkene som gjør dem så perfekte til tekstmanipulering. Klassen Regexp samler denne funksjonaliteten på en ryddig måte, men Ruby lar deg også bruke regexp literaler.

  1| # Litt HTML tekst å lete i
  2| html = '<UL>
  3| <LI><IMG SRC="next.gif">
  4| <LI><A HREF="index.html">Hei</A></LI>
  5| </UL>'
  6| 
  7| # Den ryddige måten å lage Regexp'er på:
  8| r1 = Regexp.new( '<IMG SRC=".*?">' )
  9| puts r1.match( html ).to_s #=> '<IMG SRC="next.gif">'
 10| 
 11| # Regexp-literaler
 12| r2 = /<A HREF=".*?">.*?<\/A>/ # slash må escapes
 13| puts r2.match( html ).to_s #=> '<A HREF="index.html">Hei</A>'
 14| 
 15| # String-klassen har også en del metoder som tar imot
 16| # ett Regexp-objekt, deriblant sub og gsub
 17| antall_e = 0
 18| "Hvor mange e'er er det i denne setningen?".scan(/e/){ |match|
 19|   antall_e += 1
 20| }
 21| puts "Totalt #{antall_e} e'er." #=> Totalt 9 e'er.

Regulære uttrykk er nesten en vitenskap i seg selv. Dessuten er de omtrent like lesbare som det norske lovverket etter å ha gått igjennom en makuleringsmaskin og bør derfor brukes med omhu.

Grupperinger

Ved bruk av parenteser kan vi gruppere deler av det regulære uttrykket slik at vi kan få tak i disse enkeltdelene. Det er veldig kjekt ved parsing av logger og lignende.

  1| log = '[25/Apr/2004:09:21:07 +0200] "GET / HTTP/1.1" 200 3145'
  2| 
  3| r = Regexp.new('\[(\d\d)\/(\w*)\/(\d{4}):' + # dato
  4|                '(\d{2}):(\d{2}):(\d{2})'   + # tidspunkt
  5|                ' ([+-]\d{4})\]'              # tidssone
  6|                )
  7| m = r.match log
  8| puts m[1..7].join(", ") #=> 25, Apr, 2004, 09, 21, 07, +0200


Next Previous Contents