Better approach on handling unexpected string upon converting it to the enum value
All enumerations have a default valueOf(String) method that throw an IllegalArgumentException so your first idea is coherent.

I would say that it depends (..). It depends of your use cases:


If he conversion would be called form an unsafe (user/api) input, then there are chances that you receive an unexpected symbol. And using Optional will force the developer to handle that case more explicitely. 
If the convesrion is made from a safe input (code/config), then you can live with the exception.


In the book Effective Java  from Joshua Bloch (Addison-Wesley Professional, 978-0134685991) there is a full chapter on that subject (in the 2nd edition):


  Enum types have an automatically generated valueOf(String) method that
  translates a constant’s name into the constant itself.
  
  [..]
  
  The following code
  (with the type name changed appropriately) will do the trick for any enum, so long
  as each constant has a unique string representation: 


// Implementing a fromString method on an enum type
private static final Map&lt;String, Operation&gt; stringToEnum
        = new HashMap&lt;String, Operation&gt;();
static { // Initialize map from constant name to enum constant
    for (Operation op : values())
        stringToEnum.put(op.toString(), op);
    }

// Returns Operation for string, or null if string is invalid
public static Operation fromString(String symbol) {
    return stringToEnum.get(symbol);
}


That chapter (and the whole book) is worth the read: CHAPTER 6 ENUMS AND ANNOTATIONS