Author |
set noon does not act as expected |
Micha
Member
Posts: 16
Joined: 16.12.06 |
Posted on January 20 2007 01:34 |
|
|
Hi,
I am still a beginner with VMS. Currently I am doing some execises based on a textbook*) and came accross a system behavior which i do not understand.
In the example the statement "set noon" is used to temporarily disable error detection. As described in the book, this would be useful if one wants to delete some temporary files and it is not sure if they are really there. I tried a command procedure test.com with the following contents:
$ ! deletion of certain temporary files
$ say := write sys$output
$ !
$ set noon
$ delete/nolog for*.dat;*
$ set on
$ !
$ say "the procedure made it to this point"
$ exit
Now this command procedure does not behave as I would expect it. No matter if I have the "set noon" statement enabled or disabled - I always get an error message if there are no matchin files. And the procedure always makes it to the following output statement instead of exiting on the error.
Could anyone of the more experienced VMS guys explain what is wrong with that?
Kind Regards,
Micha
-----
*) the book I am practising with: Michael D. Duffy, Getting started with OpenVMS
Edited by imiller on March 13 2008 00:42 |
|
Author |
Re: set noon does not act as expected |
brad
Member
Posts: 134
Location: Hopedale, MA USA
Joined: 15.12.05 |
Posted on January 20 2007 03:28 |
|
|
[quote:fb45e080f9="Micha"]Hi,
I am still a beginner with VMS. Currently I am doing some execises based on a textbook*) and came accross a system behavior which i do not understand.
In the example the statement "set noon" is used to temporarily disable error detection. As described in the book, this would be useful if one wants to delete some temporary files and it is not sure if they are really there. I tried a command procedure test.com with the following contents:
$ ! deletion of certain temporary files
$ say := write sys$output
$ !
[b:fb45e080f9]$ set noon[/b:fb45e080f9]
$ delete/nolog for*.dat;*
$ set on
$ !
$ say "the procedure made it to this point"
$ exit
Now this command procedure does not behave as I would expect it. No matter if I have the "set noon" statement enabled or disabled - I always get an error message if there are no matchin files. And the procedure always makes it to the following output statement instead of exiting on the error.
Could anyone of the more experienced VMS guys explain what is wrong with that?
[/quote:fb45e080f9]
Hi Micha,
Look at the following example:
$ type foo.dat
$ ! deletion of certain temporary files
$ on warning then exit
$ say := write sys$output
$ !
$! set noon
$ delete/nolog for*.dat;*
$! set on
$ !
$ say "the procedure made it to this point"
$ exit
$ @foo.dat
%DELETE-W-SEARCHFAIL, error searching for USER2:[brad]for*.dat;*
-RMS-E-FNF, file not found
Please note the "on warning then exit" statement, and the *FIRST* warning message. DCL is not acting on the *SECOND*, fatal error message, but only on the initial *WARNING* error message.
"On error then exit" is the default DCL behavior. SET ON and SET NOON modify this behavior. Try some more experimenting and keep up the questions! Good luck learning! |
|
Author |
|
Micha
Member
Posts: 16
Joined: 16.12.06 |
Posted on January 20 2007 05:58 |
|
|
Thanks a lot for the reply!
that encouraged me to do some more testing.
There ist still one detail which I do not fully understand:
There are commands that produce an error (e.g. attempts to delete a nonexisting file) but a command procedure will still continue, even without a preceding "set noon"
Other commands also produce an error (e.g. an attempt to run a noexisting executable "run junk", in that case the command procedure will exit.
Is there a logic behind that distinctive behavior?
Kind Regards
Micha
---
my current test example:
[code:1:760853bc95]
$! Test Procedure for Error Handling
$!
$ say := write sys$output
$ MSGOFF := set message /nofacility/noident/noseverity/notext
$ MSGON := set message /facility/ident/severity/text
$!
$ say "Hi out there..."
$! temporarily disable error detection and error messaging
$ set noon
$ MSGOFF
$ run junk ! which is not there
$ delete/nolog for*.dat;* ! no files for*.dat exist
$ MSGON
$ set on
$!
$ show time
$ say "the procedure survived all errors"
$ exit
[/code:1:760853bc95] |
|
Author |
Re: set noon does not act as expected |
HobbyistOne
Super Administrator
Posts: 126
Location: Plano, TX
Joined: 20.02.08 |
Posted on January 21 2007 06:02 |
|
|
[quote:e7a8aee4f3="Micha"]Hi,
I am still a beginner with VMS. Currently I am doing some execises based on a textbook*) and came accross a system behavior which i do not understand.
[/quote:e7a8aee4f3]
SET NOON changed how error [i:e7a8aee4f3]handling[/i:e7a8aee4f3] works, not error reporting. SET NOON will prevent an error from terminating the command procedure.
If you want to disable error reporting, you can do two things:
1) Put the command "$ DEFINE /USER SYS$ERROR NLA0:" just before the DELETE command, which will route error messages to the bitbucket.
2) SET MESSAGE/NOFACILITY/NOSEVERITY/NOTEXT/NOIDENTIFICATION will turn off all error, warning, success, etc output from all commands. $STATUS still contains the return status. You will need to do a SET MESSAGE/FAC/SEV/TEXT/IDENT to turn it back on, though! |
|
Author |
RE: set noon does not act as expected |
pfau
Member
Posts: 33
Location: North Brunswick, NJ
Joined: 12.03.08 |
Posted on March 12 2008 08:56 |
|
|
2) SET MESSAGE/NOFACILITY/NOSEVERITY/NOTEXT/NOIDENTIFICATION will turn off all error, warning, success, etc output from all commands. $STATUS still contains the return status. You will need to do a SET MESSAGE/FAC/SEV/TEXT/IDENT to turn it back on, though!
Best to save the prior settings and restore them afterward. Newer versions of VMS allow detection of current message settings with F$ENVIRONMENT("MESSAGE").
$ old_msg = f$environment("message")
$ set message /nofacility /noseverity /noidentification /notext
$ command_that_might_produce_errors
$ set message 'old_msg' |
|