德尔福 无效的枚举值'_24170'



我有我的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;

然后我得到异常:

内部异常消息是"无效的枚举值'_24170' 不能 反序列化为类型 "我的恩努姆"。

想要日志异常消息,其中包含我作为参数传递的字符串值,而不是一些不清楚的数字,例如"_24170"。我该怎么做?

更新:

假设我(One, Two, Three)有 3 个值的MyEnum,当我传递给我的函数字符串时"Five"我希望看到这样的异常:

无效的枚举值"Five"无法反序列化为类型"MyEnum"。

谢谢。

如果提供的文本与枚举值之一不匹配,您提供的代码不会引发异常。而是返回值 -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);

当然,您希望将其包装在一种方法中以使其可重用。

最新更新