home *** CD-ROM | disk | FTP | other *** search
- /*
- Listing 27.5. Source code for Clipper's DefError()
- function, located in ERRORSYS.PRG, reprinted
- here for reference and edited slightly for
- formatting.
- Copyright (c) 1990-91 Nantucket Corporation
- */
-
- #include "error.ch"
-
- static func DefError(e)
- local i, cMessage, aOptions, nChoice
-
- // by default, division by zero yields zero
- if ( e:genCode == EG_ZERODIV )
- return (0)
- endif
-
- // for network open error, set NETERR() and subsystem default
- if ( e:genCode == EG_OPEN .and. e:osCode == 32 .and. e:canDefault )
- NetErr(.t.)
- return (.f.) // NOTE
- endif
-
- // for lock error during APPEND BLANK, set NETERR() and subsystem default
- if ( e:genCode == EG_APPENDLOCK .and. e:canDefault )
- NetErr(.t.)
- return (.f.) // NOTE
- endif
-
- // build error message
- cMessage := ErrorMessage(e)
-
- // build options array
- // aOptions := {"Break", "Quit"}
- aOptions := {"Quit"}
-
- if (e:canRetry)
- AAdd(aOptions, "Retry")
- endif
-
- if (e:canDefault)
- AAdd(aOptions, "Default")
- endif
-
- // put up alert box
- nChoice := 0
- do while ( nChoice == 0 )
-
- if ( Empty(e:osCode) )
- nChoice := Alert( cMessage, aOptions )
- else
- nChoice := Alert( cMessage + ;
- ";(DOS Error " + NTRIM(e:osCode) + ")", ;
- aOptions )
- endif
-
- if ( nChoice == NIL )
- exit
- endif
- enddo
-
- if ( !Empty(nChoice) )
- // do as instructed
- if ( aOptions[nChoice] == "Break" )
- Break(e)
-
- elseif ( aOptions[nChoice] == "Retry" )
- return (.t.)
-
- elseif ( aOptions[nChoice] == "Default" )
- return (.f.)
- endif
- endif
-
- // display message and traceback
- if ( !Empty(e:osCode) )
- cMessage += " (DOS Error " + NTRIM(e:osCode) + ") "
- endif
-
- ? cMessage
- i := 2
- do while ( !Empty(ProcName(i)) )
- ? "Called from", Trim(ProcName(i)) + ;
- "(" + NTRIM(ProcLine(i)) + ") "
- i++
- enddo
-
- // give up
- ErrorLevel(1)
- QUIT
-
- return (.f.)
-
- * eof
-