Well you can cast to a compatible type
type
TEnum_All = (opt0, opt1, opt2, opt3, opt4);
TEnum_All_CAST = type TEnum_All;
var
a: TEnum_All;
begin
a := TEnum_All_CAST(some_int_val);
But, that has a serious down side.
Consider "range check" as a means to find bugs in your app, i.e. errors that you neither know, nor expect.
An out of range value in the above cast, however is something that you do expect. (apparently, since you want error checking).
Now you wrap that code into a "try expect" block.
And if the "try expect" catches any range check, your code handles it, as some_int_val must have been wrong.
That works, if your "try Except" is really just covering that one single statement. (But then an "if .... then" is same as good).
The "try except" can handle the error further out in your code. But then it covers more code, and that extra code may have had a genuine range check error somewhere else. And an unexpected range check some where else should not be treated equal to the expected error, because now some other variable has a "bad" value, and your entire app may be unstable.
If you keep range check for real bugs, then debugging will be a lot easier.
And in releases, well it should tell the user "save your work", because a crash may be imminent.
So, you should definitely use an "if ... then raise TEnumOutOfRangeFromDB.create(fieldname, bad_int_value, errormessage, other_important_data);"
And then your except should check for that exact error only.
Or if indeed you "try except" encloses only a single line => consider "if then" without any exception....