Hur avbryta skript inne i en handler?

Tråden skapades och har fått 14 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • 2011-04-27 13:58

Jag vill kunna avbryta ett skript i en handler om jag inte uppnår önskat resultat. Koden nedan visar en dialog för varje handler, jag vill att den ska stanna på "return" efter den första dialogen. Hur gör man?

my do1()
my do2()

on do1()
	try
		display dialog "my do1()"
		X
	on error
		return
	end try
end do1

on do2()
	try
		display dialog "my do2()"
		Y
	on error
		return
	end try
end do2
  • Medlem
  • 2011-04-27 19:38

Om du gör return i on error låtsas du om som att du har löst problemet i din error-hantering, och AppleScript tror att det är OK att fortsätta.
Vill du att scriptet ska stanna helt och hållet om användaren klickar "Cancel", ska du istället skicka felet vidare:

on do1()
	try
		display dialog "my do1()"
		X
	on error
		error
	end try
end do1

eller helt enkelt:

on do1()
	display dialog "my do1()"
	X
end do1
  • Medlem
  • 2011-04-27 22:06

Det var ett dumt exempel jag skapade, jag lade in dialogerna för att visuellt visa att den gick vidare. Det är andra saker som händer, utan interaktion.
Vad jag vill åstadkomma är att en handler ska innehålla en try-sats som ska stoppa resten av skriptet "on error".

  • Medlem
  • 2011-04-27 22:32

Då får du väl se till att din on error-hanterare antingen kastar felet vidare istället för att bara returnera, eller returnerar en status som du använder där du anropar din handler:

set success to my do1()
if success then set success to my do2()
if success then ...

on do1()
	try
		<gör nåt som kan gå fel>
		return true
	on error
		return false
	end try
end do1

on do2()
	try
		<gör nåt annat som kan gå fel>
		return true
	on error
		return false
	end try
end do2
  • Medlem
  • 2011-04-27 22:35

Det var det jag ville slippa...
Men tack ändå.

  • Medlem
  • 2011-04-27 22:39

Så här kan man kanske också göra, utan att hantera felen i respektive handler. Istället kommer felen som uppstår i handlern att tas omhand i det anropande scriptets on error:

try
	my do1()
	my do2()
on error
	<avsluta snyggt>
end try

on do1()
	<gör nåt som kan gå fel>
end do1

on do2()
	<gör nåt annat som kan gå fel>
end do2
  • Medlem
  • 2011-04-27 23:10

Men jag vill hantera felen när de dyker upp. Det aktuella skriptet innehåller runt 10 handlers som var och en hanterar fel mellan 0 och 3 ggr. Ibland ska det stanna, ibland bara logga.

  • Medlem
  • 2011-04-27 23:52

Då får du väl försöka ta reda på vad det är för fel i din on error-hanterare och göra olika saker beroende på vad som hände - logga och returnera om det går, eller kasta felet vidare om du behöver stoppa. Eller ha flera try-block i varje handler som hanterar felen på olika sätt.

set x to 1
error number -128
set x to 2

Ovanstående rad avslutar scriptet på rad 2. error number -128 är i princip en omedelbar exit, oavsett var i scriptet man befinner sig.

  • Medlem
  • 2011-04-29 19:12
Ursprungligen av Richard Rönnbäck:

error number -128 är i princip en omedelbar exit, oavsett var i scriptet man befinner sig.

...vilket ju är precis vad som händer när man trycker "Cancel" i en dialogruta i ett script.

try
	display dialog "Hepp!"
on error number errorNum
	display dialog errorNum
end try
Ursprungligen av wlao:

...vilket ju är precis vad som händer när man trycker "Cancel" i en dialogruta i ett script.

try
	display dialog "Hepp!"
on error number errorNum
	display dialog errorNum
end try

Precis, men utan dialoger…

  • Medlem
  • 2011-04-28 07:11

Ha, där satt den!

sa flickan…

  • Medlem
  • 2011-04-29 20:10

I mitt fall hade jag inga dialoger.

  • Medlem
  • 2011-04-30 09:36
Ursprungligen av Baron:

I mitt fall hade jag inga dialoger.

Jo jag förstod det.

Jag bara kom på att jag har råkat ut för ett liknande, omvänt problem: jag visar en dialogruta i ett script, men jag vill inte att "Cancel" ska innebära att scriptet avslutas tvärt.
I både detta fall och i ditt fall är det error -128 som är hemligheten. Du kastar ett error -128 för att avsluta, jag fångar upp ett error -128 för att inte avsluta.

1
Bevaka tråden