我很困惑,之间的确切关系GetLastError()
和errno
.它们是相同的数值,还是完全不同的东西?我怎么知道应该检查哪一个?
如果我想将错误代码转换为字符串进行调试,我可以FormatMessageA()
互换使用strerror_s()
吗?
最后,是否真的WSAGetLastError()
总是返回相同的GetLastError()
,或者它们都可以返回不同的值?
我正在使用CreateFile()打开一个串口.我有一个测试用例(太复杂而无法重新分配),它始终导致CreateFile()
返回INVALID_HANDLE_VALUE
和GetLastError()
返回ERROR_SUCCESS
.通过它的外观,只有当一个线程在另一个端口关闭它的同一时间打开端口时,才会出现此错误.打开端口的线程会遇到此问题.
我不知道这是否有所不同,但稍后在代码中我使用CreateIoCompletionPort将端口与CompletionPort相关联.
这是我的代码:
HANDLE port = CreateFile(L"\\\\.\\COM1",
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
0, // default security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
FILE_FLAG_OVERLAPPED, // overlapped I/O
0); // hTemplate must be NULL for comm devices
if (port == INVALID_HANDLE_VALUE)
{
DWORD errorCode = GetLastError();
cerr << L"CreateFile() failed with error: " << errorCode << endl;
}
Run Code Online (Sandbox Code Playgroud)
我很确定这种事情不应该发生.我做错了吗?如何让API返回正确的结果?
更多细节:此代码取自我开发的串行端口库:JPeripheral
这是实际的(未经过规范化的)源代码:
JLong SerialChannel::nativeOpen(String …
Run Code Online (Sandbox Code Playgroud) Windows 和 GNU/Linux 应用程序的常规返回值分别是什么。0 表示成功。但是应该在用户请求中止时使用什么。当我在 Windows 上中止时,它返回 3,但如果它不是 ERROR_PATH_NOT_FOUND,则该值不在系统错误代码列表中。GNU binutils 使用 1。从用户的角度来看,返回 GetLastError 或 errno 会很好,因为它们被记录在案,但这些似乎只涵盖较低级别的状态代码。我正在寻找一个表示“应用程序终止失败”的值
我受伤的原因是我想
exit(errcode)
Run Code Online (Sandbox Code Playgroud)
来自一个信号处理程序,它在打印有关它发生的位置的消息后捕获一些访问冲突/SIGSEGV(即编程错误)。然后错误代码应该可以从用户输入错误中识别出来。
我67
从下面的代码收到错误代码,这意味着ERROR_BAD_NET_NAME
.
为什么会这样?我该如何解决?
SOCKADDR address;
strcpy_s(address.sa_data, "8.8.8.8");
address.sa_family = AF_INET;
if (!QOSStartTrackingClient(QoSHandle, &address, 0))
cout << GetLastError();
Run Code Online (Sandbox Code Playgroud) 想知道你对这个解决方案的看法,如果这是将错误信息传递给自定义页面的正确方法吗?
在web.config中:
<customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>
Run Code Online (Sandbox Code Playgroud)
在Global.asax中:
<script RunAt="server">
void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex != null && Session != null)
{
ex.Data.Add("ErrorTime", DateTime.Now);
ex.Data.Add("ErrorSession", Session.SessionID);
HttpContext.Current.Cache["LastError"] = ex;
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
在我的Error.aspx.cs中:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
if (HttpContext.Current.Cache["LastError"] != null)
{
Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
if (ex.Data["ErrorTime"] != null && ex.Data["ErrorSession"] != null)
if ((DateTime)ex.Data["ErrorTime"] > DateTime.Now.AddSeconds(-30d) && ex.Data["ErrorSession"].ToString() == Session.SessionID)
Label1.Text = ex.InnerException.Message;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:我不想从Global.asax做一个Server.Transfer因为..我不知道.对我来说似乎很笨拙.希望能够将customErrors更改为RemoteOnly.所以必须在某处保存最后一个异常,但不能是Session,所以保存到Cache但是有一些额外的数据(时间和SessionID),因为Cache是全局的,并且希望确保不向某人显示错误的错误.
我有点改变了我的代码.现在它只是: …
我有一个使用mongoDB的node.js应用程序,并且有一个函数用于删除集合中的所有文档,然后用一些示例文档重新填充数据库中的集合。
编写新功能时,我会偶尔使用它来测试我的应用程序是否具有已知数据。
我遇到的问题是,如果我在所有集合上调用drop()然后调用一些插入来重新填充,有时记录的记录将少于我期望插入到数据库中的记录,有时整个集合将丢失。我的计数会检查所有说的#条记录,这些记录与期望的数量匹配,但是即使说它已插入,整个集合也可能丢失。
我只能假设,因为它仅发生在大约50%的时间中,也许某种程度上插入是在drop()完成之前开始插入,然后drop()会擦除插入的文档,因为它正在运行异步。
我在所有插入/更新命令上都使用了{safe:true},但是db.collection.drop()没有任何参数,而且似乎没有办法指定安全选项。
因此,我尝试在drop()之后使用db.getLastError()来阻止插入,直到拖放完成。
使用db.getLastError()或db.getlasterror()会引发错误:TypeError:对象#<Db>没有方法'getlasterror'
对getLastError的简化调用:
var mongo = require("mongodb");
var db_conn = new mongo.Db(dbName, new mongo.Server(host, port, { auto_reconnect: true }), {});
db_conn.open(function(err, db) {
if(!err) {
console.log("Database connection: \033[32mopen\033[0m");
} else {
console.log("Database connection: \033[31mfailed\033[0m");
}
});
db_conn.getLastError();
this.db_conn = db_conn;
this.users = db_conn.collection("users");
this.companies = db_conn.collection("companies");
this.suppliers = db_conn.collection("suppliers");
Run Code Online (Sandbox Code Playgroud)
我已经在mongodb模块1.1.4和1.1.7上尝试过此操作,但得到一个错误。
我使用的参考文献有误吗?在JavaScript的代码示例中,我在stackoverflow或Web上通常找不到关于getlasterror的任何内容。
如果有更好的方法可以做到这一点,我会全力以赴。
js docs:http : //docs.mongodb.org/manual/reference/javascript/#db.getLastError
mongo文档:http : //www.mongodb.org/display/DOCS/getLastError+Command
---- 2012年9月22日更新
使用下面的答案,我可以调试出根本问题所在,并且与我期望的一样。使用默认的5个开放连接池时,会随机触发分支,然后插入。取决于它们的发送顺序和它们各自进入的池,如果一个放置快速完成,然后在该集合的放置完成之前快速进行插入,则它将在以后删除插入的记录。
我的解决方法是在drop()命令的回调函数中按链接顺序包装所有的drop函数,以便每个drop函数都在触发前一个drop的回调函数之后发生,然后最后调用一个触发所有插入的回调函数。这很麻烦,但是我现在已经用20个简单插入的基本记录集和100,000条记录的loadtest测试了initializedb函数大约25次。还没有失败。
时间会证明一切,但是这个.lastError()答案可以解决此问题。
---- 2012年9月30日更新
我想测试一个星期左右,然后再回复以确保它确实有效。上周,我已经在26个记录的基础集和100,000个记录的集中批量运行了大约100次初始化脚本。我没有看到它现在使用我的新代码失败。
我用于删除集合的代码:(我有一个DatabaseHandler对象,与原型函数一起用于操作)
DatabaseHandler.prototype.dropAll = function(callback, callbackArg) { …
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过 PInvoke 从 Powershell 使用 GetFileSecurity。调用本身有效,但 System.Runtime.InteropServices.Marshal.GetLastWin32Error 和 GetLastError (我导入用于测试)都返回错误的错误代码。似乎SetLastError = true
在 PInvoke 签名中根本没有任何效果,因为在启动新的 Powershell 实例后第一次运行脚本,都返回 203 (ERROR_ENVVAR_NOT_FOUND),但是如果我再次调用相同的脚本,则都返回 0 。
作为快速测试,我编写了一个等效的 C 程序,并且 GetLastError 返回了预期值 (122 == ERROR_INSUFFICIENT_BUFFER)。
请注意,我对 Powershell 和 .NET 总体来说是新手,所以请原谅任何明显的失礼。
$signature = @'
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetFileSecurity(
string lpFileName,
int RequestedInformation,
byte [] pSecurityDescriptor,
uint nLength,
out int lpnLengthNeeded
);
[DllImport("Kernel32.dll")]
public static extern uint GetLastError();
'@
$enum = @'
namespace Win32 {
public enum SECURITY_INFORMATION : uint …
Run Code Online (Sandbox Code Playgroud) 我有两个mongo命令,在我看来应该导致相同的结果:
for(var i=0;i<1000;i++){db.test.insert({a:1}); db.getLastError({j:1, w:1});};
for(var i=0;i<1000;i++){db.test.insert({a:1}); db.runCommand({getLastError:1, j:1, w:1});};
Run Code Online (Sandbox Code Playgroud)
两个命令都正确执行插入,然而,第二个命令cca慢100倍(500毫秒vs 45秒).有谁知道,为什么会这样?只有当设置{j:1}时才会出现差异,所以它可能与某些日记问题有某种关系?
似乎某些特定于API的调用设置了返回的错误GetLastError()
。例如,wglCreateContextAttribsARB(...)
可以返回(来自规范的信息):
ERROR_INVALID_VERSION_ARB == 0x2095
ERROR_INVALID_PROFILE_ARB == 0x2096
Run Code Online (Sandbox Code Playgroud)
但是,调试时会得到不同的结果。例如,尝试用于wglCreateContextAttribsARB(...)
设置GL 4.5上下文(我的GPU不支持该上下文)会导致错误值0xC0072095
。低16位与无效版本错误相匹配(之所以有意义是因为这是版本问题),但是高16位对我而言没有意义。
我浏览了GetLastError文档,该文档说应该为应用程序错误代码设置第29位。但是,我找不到关于为什么要设置其他位的任何理由,无论如何,这与ARB规范(即返回某某值)相冲突。
这是怎么回事?
我试图通过我的USB端口(名为COM15)进行一些串行通信,我收到一个错误.这是发生错误的代码:
HANDLE myPortHandle = CreateFile("COM15",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (myPortHandle == INVALID_HANDLE_VALUE)
{
DWORD lastError = GetLastError();
cout<<"ERROR HERE! = "<<lastError<<endl;
}
Run Code Online (Sandbox Code Playgroud)
每次编译程序时,打开的串口的句柄== INVALID_HANDLE_VALUE.我在CreateFile()msdn文档中读到了使用GetLastError()以获取"扩展错误信息".现在......当我运行代码时,GetLastError()返回值:2
在GetLastError()的msdn文档中,它说:
"设置最后错误代码的每个函数的文档的返回值部分说明了函数设置最后错误代码的条件."
我试图在CreateFile()msdn文档的返回值部分中查找'2'的含义,但无法在任何地方找到含义.
题:
1)为什么会发生这种情况:myPortHandle == INVALID_HANDLE_VALUE?
2)另外,如果有人可以指引我到msdn文档中查找GetLastError()返回的'2'的含义,那就太棒了!
getlasterror ×10
createfile ×2
errno ×2
mongodb ×2
winapi ×2
windows ×2
.net ×1
asp.net ×1
c ×1
c++ ×1
caching ×1
exit-code ×1
iocp ×1
javascript ×1
linux ×1
opengl ×1
performance ×1
pinvoke ×1
powershell ×1
qos ×1
runcommand ×1
serial-port ×1
sockaddr-in ×1
wgl ×1