parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

кратко | чем throw/catch лучше if/if/if/if/if

Александр Петросян (PAF) 14.01.2005 12:17 / 14.01.2005 12:18

Было
@main[]
^first[]
^if(def $error){
	^if(^error.pos[koshmar]>=0){
	  $error, TODO:recover
	}{
	  $error, TODO:die
	}
}
@first[]
^second[]
^if(!def $error){
	working1
}
@second[]
^if(^math:random(2)){
  $error[koshmar,test1]
}
^if(!def $error){
	working2

    ^if(^math:random(2)){
      $error[uzhas,test2]
    }
    ^if(!def $error){
    	working3
    }
}
Стало
@main[]
^try{
  ^first[]
}{
  ^if($exception.type eq koshmar){
     $exception.source [$exception.type]
     $exception.handled(1)
  }
}
@first[]
^second[]
working1
@second[]
^if(^math:random(2)){
  ^throw[koshmar;test1]
}
working2

^if(^math:random(2)){
  ^throw[uzhas;test2]
}
working3
т.е. ушли все if(!def $error)

и это простой случай.
а если работа ещё в разветвлённых ветках условий, то нагромождение if(!def $error) становится астрономическим.

когда деревья были большими и я программировал на Turbo Pascal, в котором не было throw/catch, я прочёл об в книжке по C про setjmp/longjmp, так там это называется, идея немедленно была реализована парой asm-функций…

и из реального небольшого приложения было выкинуто 150 (сто пятьдесят) более ненужных проверок «if(!error)».