我有我的dll,它包含功能:
function GetPdfReport(
//this is string representation of MyEnum
AStringParam : Pchar
): TByteDynArray; stdcall; export;
var
//my vars
begin
try
try
//i try to pass incorrect string value on purpose to get exception
MyEnumVariable := TRttiEnumerationType.GetValue<MyEnum>(AStringParam);
//code hide
except
on E : Exception do
begin
//log error
Log.Error(E.ClassName + ' : ' + E.Message, 'errors');
end;
end;
finally
//dispose
end;
然后我得到例外:
InnerException消息是'无效的枚举值'_24170'不能 反序列化为类型 'MyEnum'。
我希望日志异常消息包含我作为参数传递的字符串值,但不是某些不清楚的数字,如'_24170'。我怎么能这样做?
更新
假设我有MyEnum
有3个值(One, Two, Three)
,当我传递给我的函数字符串"Five"
时,我希望看到这样的异常:
无效的枚举值'Five'无法反序列化为'MyEnum'类型。
感谢。
答案 0 :(得分:3)
如果提供的文本与其中一个枚举值不匹配,则您提供的代码不会引发异常。而是返回值-1
。当然,-1
不是有效的枚举值,因此如果您希望执行错误处理,则TRttiEnumerationType.GetValue
会成为一个相当可疑的方法。
你需要亲自测试一下。而不是使用TRttiEnumerationType
,直接转到GetEnumValue
可能更简单,var
OrdinalValue: Integer;
Value: MyEnum;
....
OrdinalValue := GetEnumValue(TypeInfo(MyEnum), AStringParam);
if OrdinalValue = -1 then
// handle error
Value := MyEnum(OrdinalValue);
返回一个整数,因此使错误检查更容易编写。
^.+(?<=abc)
当然,您希望将其包装在一个方法中以使其可重复使用。