Wish List
Post by Jack Kelly on Jan 26th, 2015, 12:16pm
Could we have?
(1) a RESUME NEXT command option for the error trapping facility, and/or
(2) a SWAP command that might also work with array elements.
In any case, I certainly hope there will be continuing releases of LBB.
Re: Wish List
Post by Richard Russell on Jan 26th, 2015, 3:01pm
on Jan 26th, 2015, 12:16pm, Jack Kelly wrote:Could we have a RESUME NEXT command |
|
Relatively easy to add, but it would necessarily have the same compatibility issue as RESUME, i.e. it would resume at the line (not statement) after the one in which the error occurred. Not a problem if you have only one statement per line.
Quote:
Again, easy to add but I worry about breaking existing programs which use 'swap' as a variable name. You could cheat and do this:
Code: v1 = 123
v2 = 456
print v1,v2
!SWAP v1,v2
print v1,v2
Any other votes for these features to be added to LBB?
Richard.
Re: Wish List
Post by tsh73 on Jan 26th, 2015, 7:38pm
I'm in for RESUME NEXT. It is really missing in LB.
Re: Wish List
Post by Jack Kelly on Jan 26th, 2015, 9:38pm
I'm fine with !SWAP.
No problem with one statement per line, especially in areas that a user could cause an error.
Re: Wish List
Post by Richard Russell on Jan 26th, 2015, 9:51pm
on Jan 26th, 2015, 7:38pm, tsh73 wrote:I'm in for RESUME NEXT. It is really missing in LB. |
|
It would be helpful (and increase the probability of me adding it!) if you could supply an example program with RESUME NEXT that I could use for testing, and perhaps put in the documentation.
Richard.
Re: Wish List
Post by tsh73 on Jan 27th, 2015, 07:45am
example from QBASIC
1. There is error could happen; we trap and handle it somehow ; but we want to continue from next statement, not from errored one
Code:CLS
ON ERROR GOTO Handler
FOR i = -5 TO 5
PRINT i, 1 / i
NEXT
END
Handler:
PRINT "Error "; ERR; " happened but we ignore and continue"
RESUME NEXT
produces
Code:-5 -.2
-4 -.25
-3 -.3333333
-2 -.5
-1 -1
0 Error 11 happened but we ignore and continue
1 1
2 .5
3 .3333333
4 .25
5 .2
2. Example from old VB (QB doesn't have ON ERROR RESUME NEXT)
Somehow on the Internet it is called "C-style error handling"
We have normal code; but there is a part that could break (it could be complex expression, or call to sub, or some device operation (file/disk/network etc))
We enclose it in ON ERROR RESUME NEXT/ON ERROR GOTO 0
(btw LB does not have ON ERROR GOTO 0 as well :(( )
Text1 is multiline textbox, Command1_Click is button handler.
Code:Private Sub Command1_Click()
'some ordinary code
Text1 = Text1 + "Hello" + vbCrLf
'isolate dangerous code
On Error Resume Next
ThisMightBreak (0)
If Err <> 0 Then
Text1 = Text1 + "!!! Some error happened" + vbCrLf
End If
On Error GoTo 0 'turn error checking off
'some more ordinary code
Text1 = Text1 + "Hello again" + vbCrLf
'second piece of dangerous code - this will break
On Error Resume Next
ThisMightBreak (1)
If Err <> 0 Then
Text1 = Text1 + "!!! Some error happened" + vbCrLf
End If
On Error GoTo 0 'turn error checking off
'last piece of ordinary code
Text1 = Text1 + "last Hello"
End Sub
Public Sub ThisMightBreak(i)
If i = 1 Then a = 1 / 0 'force error
'else
Text1 = Text1 + "Sub happened to work OK" + vbCrLf
End Sub
Output in a textbox: Code:Hello
Sub happened to work OK
Hello again
!!! Some error happened
last Hello
Re: Wish List
Post by Richard Russell on Jan 27th, 2015, 1:43pm
on Jan 27th, 2015, 07:45am, tsh73 wrote:QB doesn't have ON ERROR RESUME NEXT |
|
Do you think this construction is valuable? 'Silently' ignoring an error and continuing execution seems a relatively unlikely (and risky) thing to want to do.
What would be nicer is proper Structured Exception Handling of the TRY...CATCH sort. I could do that, but fortunately nobody's asked for it.
Quote:LB does not have ON ERROR GOTO 0 as well |
|
Oh, I thought it did. LBB has it, of course, but I don't advertise it as an enhancement. Probably I should!
Richard.
Re: Wish List
Post by Richard Russell on Jan 27th, 2015, 5:55pm
on Jan 27th, 2015, 07:45am, tsh73 wrote:I'm in for RESUME NEXT. It is really missing in LB. |
|
OK, I have added RESUME NEXT to my Work In Progress version. With this program:
Code: CLS
ON ERROR GOTO [Handler]
FOR i = -5 TO 5
PRINT i, 1 / i
NEXT
END
[Handler]
PRINT Err$; " happened but we ignore and continue"
RESUME NEXT
I get this output:
Code:-5 -0.2
-4 -0.25
-3 -0.333333333
-2 -0.5
-1 -1
0 Division by zero at line 5 happened but we ignore and continue
1 1
2 0.5
3 0.333333333
4 0.25
5 0.2
And with this code:
Code: CrLf$ = chr$(13);chr$(10)
'some ordinary code
Text1$ = Text1$ + "Hello" + CrLf$
'isolate dangerous code
On Error Goto [resume.next]
dummy = 1 / 1
If Err <> 0 Then
Text1$ = Text1$ + "!!! Some error happened" + CrLf$
End If
On Error GoTo 0 'turn error checking off
'some more ordinary code
Text1$ = Text1$ + "Hello again" + CrLf$
'second piece of dangerous code - this will break
On Error Goto [resume.next]
dummy = 1 / 0
If Err <> 0 Then
Text1$ = Text1$ + "!!! Some error happened" + CrLf$
End If
On Error GoTo 0 'turn error checking off
'last piece of ordinary code
Text1$ = Text1$ + "last Hello"
Print Text1$
End
[resume.next]
Resume Next
I get this output:
Code:Hello
Hello again
!!! Some error happened
last Hello
The ThisMightBreak(n) technique won't work in LBB as it stands, because the error is thrown inside the SUB (and the RESUME NEXT attempts to continue execution inside the SUB).
I could make LBB reproduce the VB behaviour (the error is effectively thrown in the CALL statement), but it's considerably more complicated and it might break compatibility with LB's existing RESUME functionality.
Richard.
Re: Wish List
Post by tsh73 on Jan 27th, 2015, 8:32pm
Quote:Quote:LB does not have ON ERROR GOTO 0 as well Oh, I thought it did. LBB has it, of course, but I don't advertise it as an enhancement. Probably I should! |
|
Indeed. I remember having trouble debugging someone else's program which had on error in a main module. Program didn't worked without on error at all, and there are no way to turn it off once it started. (and I reckon something weird in debugger too)
Quote:OK, I have added RESUME NEXT to my Work In Progress version. |
|
Great. Thanks a lot.
Quote:Do you think this construction is valuable? 'Silently' ignoring an error and continuing execution seems a relatively unlikely (and risky) thing to want to do. |
|
Well, if used right (set to ignore an error for a dangerous statement - check and restore normal handling with ON ERROR GOTO 0 right after) , it might be helpful.
EDIT
it's still with us in VBS and Ms Excel.
Re: Wish List
Post by Alincon on Jan 29th, 2015, 12:52am
I'd like like the LBB tool bar to have that icon on the LB tool bar that, when clicked, shows a list of the branch names, and then I can jump right to the one I want. I use this feature a lot.
Also I'd like LBB to automatically nullify the 'nomainwin command when the program is run in debug mode.
r.m.
Re: Wish List
Post by Richard Russell on Jan 29th, 2015, 11:50am
on Jan 29th, 2015, 12:52am, Alincon wrote:I'd like like the LBB tool bar to have that icon on the LB tool bar that, when clicked, shows a list of the branch names |
|
I agree it's a nice feature. My concern would be whether I could generate the list of branch/function/sub names in a sensible time-frame if the program is really large (I know of programs in excess of 60,000 lines being compiled with LBB).
I know it's not entirely a substitute, but remember that in LBB you can right-click on a branch/function/sub name and then select Jump to from the displayed context menu; to return from where you came right-click and select Go back.
I would speculate that commonly when you want to jump to a particular branch/function/sub it's because you are currently looking at some code which references it (e.g. a GOTO or a CALL), so in that circumstance the right-click option does the job.
Quote:Also I'd like LBB to automatically nullify the 'nomainwin command when the program is run in debug mode. |
|
I'll investigate the practicality of that.
Richard.
Re: Wish List
Post by Richard Russell on Jan 31st, 2015, 12:55pm
on Jan 29th, 2015, 12:52am, Alincon wrote:Also I'd like LBB to automatically nullify the 'nomainwin command when the program is run in debug mode. |
|
I can confirm that this will be in the next release of LBB, due in March.
Richard.
Re: Wish List
Post by bluatigro on Feb 1st, 2015, 2:33pm
Code:
Code:
call subname a( 13 ) , a( 14 ) , a( 15 )
end
sub subname byref x , byref y , byref z
end sub
Re: Wish List
Post by Richard Russell on Feb 1st, 2015, 3:23pm
on Feb 1st, 2015, 2:33pm, bluatigro wrote:
Any other votes for this?
Quote: Code:call subname a( 13 ) , a( 14 ) , a( 15 )
end
sub subname byref x , byref y , byref z
end sub |
|
Good catch! That should definitely work (in LBB), the fact that it doesn't is a mistake on my part. I'll fix it in the next release. Thank you!
Richard.
Re: Wish List
Post by Richard Russell on Feb 8th, 2015, 1:45pm
on Jan 27th, 2015, 5:55pm, Richard Russell wrote:OK, I have added RESUME NEXT to my Work In Progress version. |
|
Sorry to mess you around, but I've taken it out again! I decided that with SEH being supported in the next release of LBB it didn't make much sense to support the outdated RESUME NEXT as well.
The SEH equivalent to the previous simple example is as follows, and it's much nicer (IMHO):
Code: CLS
FOR i = -5 TO 5
TRY
PRINT i, 1 / i
CATCH
PRINT Err$; " happened but we ignore and continue"
END TRY
NEXT
END
And here is the SEH equivalent to the more complex example; no GOTOs, no labels, this is how modern code should be written!:
Code: CrLf$ = chr$(13);chr$(10)
'some ordinary code
Text1$ = Text1$ + "Hello" + CrLf$
'isolate dangerous code
Try
Call Reciprocal 1
Catch
Text1$ = Text1$ + "!!! Some error happened" + CrLf$
End Try
'some more ordinary code
Text1$ = Text1$ + "Hello again" + CrLf$
'second piece of dangerous code - this will break
Try
Call Reciprocal 0
Catch
Text1$ = Text1$ + "!!! Some error happened" + CrLf$
End Try
'last piece of ordinary code
Text1$ = Text1$ + "last Hello"
Print Text1$
End
Sub Reciprocal n
dummy = 1 / n
End Sub
Richard.