Hi,
I use the below code and I can successfully catch the error 98 that is raised (unable to open file)..
DEFINE VARIABLE lvMessage AS CHARACTER NO-UNDO. DEFINE STREAM strFile. MAINBLOCK: DO ON ERROR UNDO, LEAVE: ASSIGN lvMessage = "". OUTPUT STREAM strFile TO VALUE( "c:\tempr\blah.txt" ). OUTPUT STREAM strFile CLOSE. CATCH lvError AS Progress.Lang.Error: ASSIGN lvMessage = SUBSTITUTE("Caught! &1", lvError:GetMessage(1) ). END CATCH. END. /* MAINBLOCK */ MESSAGE lvMessage VIEW-AS ALERT-BOX INFO BUTTONS OK.
But when I change the code to the below I no longer get the message from the catch block, instead the program errors...
DEFINE TEMP-TABLE ttList NO-UNDO FIELD tDate AS DATE FIELD tSeq AS INTEGER FIELD tText AS CHARACTER INDEX tabix IS PRIMARY tDate tSeq. DEFINE VARIABLE lvMessage AS CHARACTER NO-UNDO. DEFINE STREAM strFile. /************************************/ CREATE ttList. ASSIGN ttList.tDate = TODAY ttList.tSeq = 1 ttList.tText = "A". CREATE ttList. ASSIGN ttList.tDate = TODAY ttList.tSeq = 2 ttList.tText = "B". CREATE ttList. ASSIGN ttList.tDate = TODAY ttList.tSeq = 3 ttList.tText = "C". /************************************/ MAINBLOCK: DO ON ERROR UNDO, LEAVE: ASSIGN lvMessage = "". FOR EACH ttList NO-LOCK BREAK BY ttList.tDate BY ttList.tSeq: IF FIRST-OF(ttList.tDate) THEN DO: OUTPUT STREAM strFile TO VALUE( SUBSTITUTE("c:\tempr\&1.txt", ttList.tSeq) ). END. PUT STREAM strFile UNFORMATTED ttList.tText SKIP. IF LAST-OF(ttList.tDate) THEN DO: OUTPUT STREAM strFile CLOSE. END. END. CATCH lvError AS Progress.Lang.Error: ASSIGN lvMessage = lvError:GetMessage(1). END CATCH. END. /* MAINBLOCK */ MESSAGE lvMessage VIEW-AS ALERT-BOX INFO BUTTONS OK.
How is the catch not working in the second example?
Windows 7, OE 10.2B08
Thanks
If you were on a higher version you could use:
BLOCK-LEVEL ON ERROR UNDO, THROW.
But since you are not, you will need to add explicit ON ERROR UNDO, THROW to the FOR EACH.
If you were on a higher version you could use:
BLOCK-LEVEL ON ERROR UNDO, THROW.
But since you are not, you will need to add explicit ON ERROR UNDO, THROW to the FOR EACH.
Your catch is not in the correct block for the error. This works:
DEFINE TEMP-TABLE ttList NO-UNDO FIELD tDate AS DATE FIELD tSeq AS INTEGER FIELD tText AS CHARACTER INDEX tabix IS PRIMARY tDate tSeq. DEFINE VARIABLE lvMessage AS CHARACTER NO-UNDO. DEFINE STREAM strFile. /************************************/ CREATE ttList. ASSIGN ttList.tDate = TODAY ttList.tSeq = 1 ttList.tText = "A". CREATE ttList. ASSIGN ttList.tDate = TODAY ttList.tSeq = 2 ttList.tText = "B". CREATE ttList. ASSIGN ttList.tDate = TODAY ttList.tSeq = 3 ttList.tText = "C". /************************************/ MAINBLOCK: DO ON ERROR UNDO, LEAVE: ASSIGN lvMessage = "". FOR EACH ttList NO-LOCK BREAK BY ttList.tDate BY ttList.tSeq: IF FIRST-OF(ttList.tDate) THEN DO: OUTPUT STREAM strFile TO VALUE( SUBSTITUTE("c:\tempr\&1.txt", ttList.tSeq) ). END. PUT STREAM strFile UNFORMATTED ttList.tText SKIP. IF LAST-OF(ttList.tDate) THEN DO: OUTPUT STREAM strFile CLOSE. END. CATCH lvError AS Progress.Lang.Error: ASSIGN lvMessage = lvError:GetMessage(1). END CATCH. END. END. /* MAINBLOCK */ MESSAGE lvMessage VIEW-AS ALERT-BOX INFO BUTTONS OK.
Or as Stefan says.
Thanks guys. I will go with Stefan's suggestion as the code is a little more detailed than the example I provided and there is more that could error so scoping both blocks to the one catch works better for me