VB.NET中Err.Raise抛错后Err.Description显示为空的问题
解决VB.NET中Err.Raise后Err.Description为空的问题
我碰到过不少类似的情况,明明按语法抛出了错误,却拿不到描述信息。结合你的代码和VB.NET的错误处理机制,给你梳理几个可能的原因和解决办法:
1. 自定义错误号必须使用正确范围
VB.NET里系统错误号的范围是0到65535,如果你用的FNReleaseError.ErrFNPropValueNotValid是自定义错误码,必须加上vbObjectError(值为-2147221504)来标记这是自定义错误。直接用小于vbObjectError的编号,系统可能不会正确保留你传入的描述内容。
修改你的Err.Raise调用:
Err.Raise(vbObjectError + FNReleaseError.ErrFNPropValueNotValid, , FNPropValueNotValid & "Property Name = " & _ l_strIndexName & " Property Value = " & l_objIndexValue.Value)
2. 先确认错误描述字符串本身有效
虽然你说所有变量都已正确赋值,但还是建议先单独拼接并输出描述内容,排除字符串本身为空的可能。可以在Err.Raise前加一行调试代码:
Dim errorDesc As String = FNPropValueNotValid & "Property Name = " & l_strIndexName & " Property Value = " & l_objIndexValue.Value ' 输出到调试窗口看内容 System.Diagnostics.Debug.WriteLine("待抛出的错误描述:" & errorDesc) Err.Raise(...) ' 原调用语句
如果调试窗口里这个字符串是空的,那问题就出在拼接的变量上,得重新检查FNPropValueNotValid、l_strIndexName或l_objIndexValue.Value的赋值逻辑。
3. 在错误处理块中先判断是否真的触发了错误
有时候如果代码没走到Err.Raise(比如测试时的分支问题),Err.Description自然是空的。可以在处理块里先做个判断:
CreateSyncDocumentErr: If Err.Number <> 0 Then WriteTraceEntry(Err.Description, False) ' 处理完记得清除Err对象,避免影响后续代码 Err.Clear() End If
4. 建议迁移到Try-Catch(更可靠的现代写法)
On Error GoTo是VB6遗留的错误处理方式,VB.NET推荐用Try-Catch结构,错误信息更稳定,调试也更方便:
Public Function CreateSyncDocument() Try Throw New Exception(FNPropValueNotValid & "Property Name = " & l_strIndexName & " Property Value = " & l_objIndexValue.Value) Catch ex As Exception WriteTraceEntry(ex.Message, False) End Try End Function
如果需要更复杂的错误信息,还可以自定义继承自Exception的异常类,携带更多业务相关的错误属性。
内容的提问来源于stack exchange,提问作者Anurag
相关产品推荐
相关产品推荐

