From WikiChip
Difference between revisions of "mirc/goto statements"
< mirc

(Error Resetting)
(Error Handling)
Line 43: Line 43:
  
 
== Error Handling ==
 
== Error Handling ==
Although it is rare to use this feature, the "error" label is a designated goto section for error checking. If there is an error in the script, mIRC will execute this section. This gives you the ability to continue with the script regardless of the error. If an error occurs but mIRC cannot locate an error goto label in the current routine, mIRC will propagate back to any calling routine and look for one there.
+
Although it is rare to use this feature, the "error" label is a designated goto section for error checking. If there is an error in the script, mIRC try to find an :error label in the current routine and will propagate backward to any calling routine and look for one there. This gives you the ability to continue with the script regardless of the error if you want. Note that mIRC is an error state in this case, after catching an error with :error, if you want to keep going with the code, use /reseterror as soon as possible (after eventually checking for $error, which return the error catched), this reset the error (and therefore $error ) and you can go from that, if you try to use anything else before resetting the error, mIRC can broke, so be careful (see examples).
  
 
<syntaxhighlight lang="mirc">Alias Example {
 
<syntaxhighlight lang="mirc">Alias Example {
Line 54: Line 54:
 
   :error
 
   :error
 
   echo -a Error: $error
 
   echo -a Error: $error
}</syntaxhighlight>
+
}
 +
;In this case, we try to execute something else than /reseterror after reaching :error, for some reasons, that $regsubex is just too much, you should get the first echo 'ok' and an echo '> $str(ab,2000)' is expected but you shouldn't see it.
 +
;When mIRC is in an error state, it's unclear what you can do and what you can't do, it's recommended not to leave the current routine by calling a custom alias but as you can see, it's not even necessary, so don't try to do anything else than calling /reseterror after reaching :error.
 +
alias testgoto {
 +
  if
 +
  :error
 +
  echo -a ok | echo -a > $regsubex($str(ab,2000),/(a*)b*(a*)*b/,)
 +
}
 +
</syntaxhighlight>
  
 
== Error Resetting ==
 
== Error Resetting ==

Revision as of 19:20, 6 April 2014

Template:mIRC Guide Goto is a command that allows you to jump unconditionally to a specific location within a procedure. Gotos can 'jump' forward or backward within a script but they may not leave the alias or event itself (they cannot jump to any calling routine as well). The goto command tells mIRC to jump to another line which matches a label.

Although in many cases the use of gotos can often lead to spaghetti-code. and can usually be replaced with easier to read and follow while statements and if statements, it is still important to understand this command and have it in your toolbox.

Syntax

The goto command has the following syntax:

goto label

A line is labeled using the following syntax:

:label

The label has to start with the colon symbol (:) and must be a single word.</p>

Conditional transfer of control

Many times you only want a script to go to a specific location according to a certain condition. You can use an if statement to achieve this. A simple syntax looks like this:

if (<condition>) {
  goto label
}

Goto Loops

Goto statements can also be used to create a loop by jumping back to a previous location in the script. The example below is a simple loop counting from 1 to 10. If for any reason you mistakenly caused your script to execute endlessly, you manually break the loop using the Ctrl+Break keys.

Alias Count {
  :loop
  var %c $calc(%c + 1)
  echo -a %c
  if (%c <= 9) goto loop
}

Random Name Example

Sometimes a goto can result in smaller code if we need a do-while style loop like other languages. A practical example of this is a random nickname generator which excludes us from the list. Such alias might look like this:

; precondition: $nick($chan, 0) > 1
alias rnd {
  :retry
  if ($nick($chan, $rand(1, $nick($chan, 0))) == $me) goto retry
  return $v1
}

Error Handling

Although it is rare to use this feature, the "error" label is a designated goto section for error checking. If there is an error in the script, mIRC try to find an :error label in the current routine and will propagate backward to any calling routine and look for one there. This gives you the ability to continue with the script regardless of the error if you want. Note that mIRC is an error state in this case, after catching an error with :error, if you want to keep going with the code, use /reseterror as soon as possible (after eventually checking for $error, which return the error catched), this reset the error (and therefore $error ) and you can go from that, if you try to use anything else before resetting the error, mIRC can broke, so be careful (see examples).

Alias Example {
  /*
    Second parameters of the $rand identifier is missing.
    Deliberate Error
  */
  echo -a $rand(1,)
  return
  :error
  echo -a Error: $error
}
;In this case, we try to execute something else than /reseterror after reaching :error, for some reasons, that $regsubex is just too much, you should get the first echo 'ok' and an echo '> $str(ab,2000)' is expected but you shouldn't see it.
;When mIRC is in an error state, it's unclear what you can do and what you can't do, it's recommended not to leave the current routine by calling a custom alias but as you can see, it's not even necessary, so don't try to do anything else than calling /reseterror after reaching :error.
alias testgoto {
  if
  :error
  echo -a ok | echo -a > $regsubex($str(ab,2000),/(a*)b*(a*)*b/,)
}

Error Resetting

Using the /reseterror you can continue on with the rest of the script. Not resetting the error will leave mIRC in a error state, if you do not reset the error, you can use /return to allow mirc to directly try to find a :error goto in the previous calling routine; if you do not use /return and mIRC is in an error state, you can't really keep going with the code, mIRC will not work correctly after using 'some function' but can operate correctly if you don't those function. If no :error goto is found after callingwhen an error occurs, mIRC will display is own shouldn't be trying to do anything else halt script execution (in such case, mIRC will keep looking for ":error" in all calling routines).

Alias Foo {
  echo -a $FooBar
}
Alias Bar { 
  return $mid($1)
}
Alias FooBar {
  return $Bar(Example)
  :error
  echo -a Error Using Value 1000 instead! ( $+ $error $+ )
  reseterror
  return 1000
}


Although the code might look a little confusing, bear with me. Calling alias /Foo will echo what alias FooBar returns. Alias foobar will return what alias bar returns. Because alias bar errors out (since $mid is missing a few parameters) , the "error" section of the foobar alias will get executed, echoing Error followed by the error message and returning 1000 to alias foo. The /reseterror command effectively prevents mIRC from halting the script and allows it to finish executing.