www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - ErrnoException in Windows

reply "novice2" <sorry noem.ail> writes:
Could you, please, help me to understand, why code:

////////////////
import std.c.windows.windows;
import std.exception: ErrnoException;
import std.stdio: writefln;
import std.string: toStringz;

void main ()
{
   CreateFileA(toStringz("nonexisting file name"), GENERIC_READ, 
FILE_SHARE_READ, null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 
null);
   auto ex = new ErrnoException("CreateFileA");
   writefln("ex.errno=%d, ex.msg=%s, lasterror=%d", ex.errno, 
ex.msg, GetLastError());
}
////////////////

prints:
ex.errno=0, ex.msg=CreateFileA (No error), lasterror=2

I wanted it will be:
ex.errno=2, ex.msg=CreateFileA (File not found), lasterror=2
Mar 01 2015
next sibling parent ketmar <ketmar ketmar.no-ip.org> writes:
On Sun, 01 Mar 2015 16:39:27 +0000, novice2 wrote:

 Could you, please, help me to understand, why code:
'cause winapi functions never sets `errno`. `errno` is a libc feature,=20 and winapi knows nothing about libc. besides, `GetLastError()` is not=20 required to return correct errno codes. so you have to either use libc funcions, or translate `GetLastError()`=20 codes to errno manually.=
Mar 01 2015
prev sibling parent reply "Vladimir Panteleev" <vladimir thecybershadow.net> writes:
On Sunday, 1 March 2015 at 16:39:29 UTC, novice2 wrote:
 I wanted it will be:
 ex.errno=2, ex.msg=CreateFileA (File not found), lasterror=2
Here's the right way to do this: ////////////////////////// test.d ////////////////////////// import std.c.windows.windows; import std.string : toStringz; import std.windows.syserror : wenforce; void main () { auto handle = CreateFileA(toStringz("nonexisting"), GENERIC_READ, FILE_SHARE_READ, null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, null); wenforce(handle != INVALID_HANDLE_VALUE, "CreateFileA"); } //////////////////////////////////////////////////////////// See std.windows.syserror for more information.
Mar 01 2015
parent reply "novice2" <sorry noem.ail> writes:
Thans guys!

wenforce not sutable - error code is lost.
may be, i will use modified wenforce, wich throws ErrnoException.
Mar 01 2015
parent "novice2" <sorry noem.ail> writes:
Ha, i found
std.windows.syserror: WindowsException, wenforce;
Mar 01 2015