Как использовать ключевое слово throws в стиле Java в C #?

Теоретически, это должно работать,

Но я предлагаю взглянуть на использование $ eq вместо этого.

Вот пример

const ret = await dbTable.find( { shortUrl: { $eq: url3 } } );

82
задан newfurniturey 28 December 2012 в 20:17
поделиться

6 ответов

В Java вы должны либо обработать исключение, либо пометить метод как тот, который может его генерировать, используя ключевое слово throws .

В C # нет этого или эквивалентного ключевого слова, как в C #, если вы не обрабатываете исключение, оно будет всплывать, пока не будет обнаружено, или, если оно не будет обнаружено, завершит программу.

Если вы хотите справиться с этим, затем выполните повторное выбрасывание, вы можете сделать следующее:

try
{
  // code that throws an exception
}
catch(ArgumentNullException ex)
{
  // code that handles the exception
  throw;
}
67
ответ дан 24 November 2019 в 09:06
поделиться

Если бы цель c# метода состоит в том, чтобы только выдать исключение (как тип возврата js, говорит), я рекомендовал бы просто возврату то исключение. Посмотрите, что пример ревет:

    public EntityNotFoundException GetEntityNotFoundException(Type entityType, object id)
    {
        return new EntityNotFoundException($"The object '{entityType.Name}' with given id '{id}' not found.");
    }

    public TEntity GetEntity<TEntity>(string id)
    {
        var entity = session.Get<TEntity>(id);
        if (entity == null)
            throw GetEntityNotFoundException(typeof(TEntity), id);
        return entity;
    }

0
ответ дан 24 November 2019 в 09:06
поделиться

На самом деле отсутствие проверяемых исключений в C# можно считать хорошим или плохим явлением.

Сам я считаю это хорошим решением, поскольку проверяемые исключения создают следующие проблемы:

  1. Технические исключения просачиваются на бизнес/доменный уровень, потому что вы не можете их правильно обработать на низком уровне.
  2. Они относятся к сигнатуре метода, что не всегда хорошо сочетается с дизайном API.

Из-за этого в большинстве крупных приложений при возникновении проверяемых Исключений вы часто увидите следующий паттерн:

try {
    // Some Code
} catch(SomeException ex){
    throw new RuntimeException(ex);
}

Что по сути означает эмуляцию того, как C#/.NET обрабатывает все Исключения.

3
ответ дан 24 November 2019 в 09:06
поделиться

Оп спрашивает о C#-эквиваленте throws в Java - не о throw ключевом слове. Оно используется в подписях методов в Java, чтобы указать, что может быть выброшено проверяемое исключение.

В C# нет прямого эквивалента проверяемого исключения Java. В C# нет эквивалентного пункта в подписи метода.

// Java - need to have throws clause if IOException not handled
public void readFile() throws java.io.IOException {
  ...not explicitly handling java.io.IOException...
}

переводится как

// C# - no equivalent of throws clause exceptions are unchecked
public void ReadFile() 
{
  ...not explicitly handling System.IO.IOException...
}
96
ответ дан 24 November 2019 в 09:06
поделиться

Вот ответ на аналогичный вопрос, который я только что финансировал на bytes.com :

Краткий ответ - нет, в C # нет проверенных исключений. В разработчик языка обсуждает это решение в этом интервью:

http://www.artima.com/intv/handcuffs.html

Ближайшее, что вы можете получить, - это использовать теги в вашем XML документацию и распространять документы, созданные NDoc, вместе с вашим код / ​​сборки, чтобы другие люди могли видеть, какие исключения вы выбрасываете (это именно то, что делает MS в документации MSDN). Ты не можешь полагаться на компиляторе, чтобы сообщить вам о необработанных исключениях, однако, например, вы, возможно, привыкли в java.

18
ответ дан 24 November 2019 в 09:06
поделиться

Вы спрашиваете об этом:

Повторное генерирование исключения

public void Method()
{
  try
  {
      int x = 0;
      int sum = 100/x;
  }
  catch(DivideByZeroException e)
  {
      throw;
  }
}

или

static void Main() 
    {
        string s = null;

        if (s == null) 
        {
            throw new ArgumentNullException();
        }

        Console.Write("The string s is null"); // not executed
    }
2
ответ дан 24 November 2019 в 09:06
поделиться