Ну, от вопроса, я вижу 2 варианта.
- Вы всегда хотите сообщение (второй аргумент)
- Вам иногда нужно сообщение, иногда нет, а иногда другое сообщение.
В первом случае вы просто удалили бы определение первого конструктора. У вас всегда будет сообщение, если вы не укажете второй аргумент.
public class TrainingSetCardinalityMismatch : ArgumentOutOfRangeException
{
public TrainingSetCardinalityMismatch(
string paramName = "trainingSets",
message = "Number of training sets provided must match number of answers provided")
: base(paramName, message)
{
//code here
}
}
Тогда вы могли бы назвать это так:
// default param name + default message
throw new TrainingSetCardinalityMismatch();
// custom param, default message
throw new TrainingSetCardinalityMismatch("custom param");
// custom param, custom message
throw new TrainingSetCardinalityMismatch("custom param", "custom message");
Однако он не позволяет использовать параметры по умолчанию, но с пользовательским сообщением.
Если вы хотите этого, у вас есть несколько возможностей:
- Можно было бы иметь константу для сообщения по умолчанию и указать ее явно вместо жестко закодированной строки.
- Другим может быть изменение порядка параметров, если большую часть времени необходимо настраивать сообщение.
- Еще один вариант - иметь статические функции, вызывающие исключение.
- Еще один вариант - установить значение по умолчанию, равное нулю, если при указании значения, равного нулю, заменить на значение по умолчанию. Таким образом, вы можете использовать пустую строку, если вы действительно не хотите сообщений.
- Еще один - иметь 2 класса исключений (скажем, TrainingSetCardinalityMismatchA
and
TrainingSetCardinalityMismatchB`), и у каждого из них есть один конструктор.
- Другим желанием будет использование
enum
вместо строки при использовании предопределенных сообщений, и тогда конструктор с настраиваемым сообщением не будет иметь никакого значения по умолчанию, так как он будет использоваться только для конкретного сообщения.
Обычно я предпочитаю последний способ, и тогда я мог бы использовать ресурс и немного кода, чтобы загрузить соответствующую строку из идентификатора enum
, что относительно просто в C #, так как вы можете enum_var.ToString()
получить имя и используйте это имя для загрузки ресурса по его имени с помощью диспетчера ресурсов (см. https://docs.microsoft.com/en-us/dotnet/api/system.resources.resourcemanager?view=netframework-4.7.2).