delphi枚举值无效'_24170'

时间:2017-11-03 07:33:41

标签: delphi enums

我有我的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'类型。

感谢。

1 个答案:

答案 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)

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