You know that setters deal with one argument only?
In your example it the Arbitrary Argument Lists is not sufficient. They are strong when you enter an unknown number of objects that should be dealt equally. Such as print(“a”,1,id(x)).
In your example each argument has a specific purpose (start, end). So you better use the normal argument notation generateRandomTime(start, end). You can skip the later arguments by assigning a default value: generateRandomTime(start, end=None)
If you still want to use several object together with the property syntax, you can place them into a container:
Better do not use except without an explicit error. Otherwise it will catch any error. So you will never see that they occurred.
The only reason to catch all errors is, when you want to deal with all of them e.g. by encapsulating code very strong. You still should deal with them rather than silently ignore them.
An house will still burn even without a smoke detector. The only difference … there is less chance you can rescue yourself if it happens. The same belongs to code. Accept that there are errors, deal with them. It could even mean to forward the error to someone else.