Каковы лучшие практики при использовании БОЛЬШОГО ГЛОТКА с C#?

Важные вещи, чтобы понять здесь

  1. Обе функции then и catch возвращают новые объекты обещания.
  2. Выбрасывая или явно отклоняя, будет перемещать текущий обещают отклоненное состояние.
  3. Поскольку then и catch возвращают новые объекты обещания, они могут быть привязаны.
  4. Если вы бросаете или отклоняете внутри обработчика обещаний (then или catch), он будет обрабатываться в следующем обработчике отклонения по пути цепочки.
  5. Как упоминалось jfriend00, обработчики then и catch не выполняются синхронно. Когда обработчик бросает, он немедленно прекратится. Таким образом, стек будет размотан, и исключение будет потеряно. Вот почему бросание исключения отвергает текущее обещание.

В вашем случае вы отклоняете внутри do1, бросая объект Error. Теперь текущее обещание будет в состоянии отклонения, и управление будет передано следующему обработчику, который в нашем случае then.

Поскольку обработчик then не имеет обработчика отклонения , do2 не будет выполняться вообще. Вы можете подтвердить это, используя console.log внутри него. Поскольку текущее обещание не имеет обработчика отклонения, оно также будет отклонено с использованием значения отклонения от предыдущего обещания, и управление будет передано следующему обработчику, который является catch.

Поскольку catch является обработчиком отклонения, когда вы console.log(err.stack); внутри него, вы можете видеть трассировку стека ошибок. Теперь вы выбрасываете из него объект Error, так что обещание, возвращенное catch, также будет находиться в состоянии отклонения.

Поскольку вы не привязали обработчик отклонения к catch, вы неспособный наблюдать отклонение.


Вы можете разделить цепочку и понять это лучше, например

var promise = do1().then(do2);

var promise1 = promise.catch(function (err) {
    console.log("Promise", promise);
    throw err;
});

promise1.catch(function (err) {
    console.log("Promise1", promise1);
});

. Вы получите то, что вы получите

Promise Promise { <rejected> [Error: do1] }
Promise1 Promise { <rejected> [Error: do1] }

Внутри обработчика catch вы получаете значение promise объекта как отклоненного.

То же самое, обещание, возвращаемое обработчиком catch 1, также отклоняется с той же ошибкой, с которой promise был отклонен, и мы наблюдаем его во втором обработчике catch.

18
задан Dale Ragan 27 August 2008 в 01:12
поделиться

3 ответа

Я думаю, что ошибка, сделанная предыдущими плакатами, заключалась в том, что читали документацию, а не смотрели на примеры.

Несколько часов назад мне нужно было связать некоторые классы C ++ с C #. Я заглянул в свой каталог Swig (он у меня уже был для другой работы), нашел каталог Примеры / csharp / class , просмотрел код, загрузил решение, просмотрел его, скопировал, вставил в свой код, это сработало, моя работа была сделана.

С учетом сказанного, сгенерированный код P / Invoke не решение для любых нужд. В зависимости от вашего проекта, может быть так же просто написать несколько простых оболочек API самостоятельно или написать управляемый C ++ (превосходный пример этого можно найти в SlimDX).

Для моих нужд это было просто и легко - у меня был mystuff.dll , а теперь я могу дополнительно отправить mystuffnet.dll . Я согласен, что в документ трудно войти.

Edit: Я заметил, что OP упоминает только C. Для этого вам действительно не нужен Swig, просто используйте обычный синтаксис взаимодействия C # / C DLLImport . Swig становится полезным, когда вы хотите, чтобы классы C ++ вызывались из C #.

это было просто и легко - у меня был mystuff.dll , а теперь я могу дополнительно отправить mystuffnet.dll . Я согласен с тем, что в документ трудно попасть.

Edit: Я заметил, что OP упоминает только C. Для этого вам действительно не нужен Swig, просто используйте обычный синтаксис взаимодействия C # / C DLLImport . Swig становится полезным, когда вы хотите, чтобы классы C ++ вызывались из C #.

это было просто и легко - у меня был mystuff.dll , а теперь я могу дополнительно отправить mystuffnet.dll . Я согласен с тем, что в документ трудно попасть.

Edit: Я заметил, что OP упоминает только C. Для этого вам действительно не нужен Swig, просто используйте обычный синтаксис взаимодействия C # / C DLLImport . Swig становится полезным, когда вы хотите, чтобы классы C ++ вызывались из C #.

9
ответ дан 30 November 2019 в 08:16
поделиться

Я действительно пытался использовать БОЛЬШОЙ ГЛОТОК для обертывания C++ проекта для использования в.NET несколько лет назад.

я не стал очень далеким, поскольку это была обширная гигантская боль для создания конфигурации тот требуемый БОЛЬШОЙ ГЛОТОК. В то время, когда я просто хотел решение, для не изучения другого языка/API/и т.д. БОЛЬШОЙ ГЛОТОК может быть легче использовать эти дни, я не мог сказать Вам.

Мы закончили тем, что использовали Управляемый С++ для обертывания проекта C++. Это работало действительно хорошо.

, Если бы Вы просто вызываете функции прямо из dll, я предложил бы не волноваться ни об одном из вышеупомянутого и просто использовать P/Invoke

5
ответ дан 30 November 2019 в 08:16
поделиться

Для моего последнего проекта вот полный файл конфигурации C # SWIG:

%module mdProject

%{
#include "mdProject.h"
%}

Я скомпилировал его в SWIG с помощью:

swig -csharp -c++ -I../../Include mdProject.i

Это сгенерировало Project.cxx, который я скомпилировал и связал непосредственно с 'main' DLL, поэтому мне не понадобилась вторая 'вспомогательная' DLL C ++. SWIG также сгенерировал кучу файлов C #, которые я скомпилировал в .NET DLL. Другие мои оболочки (Java, PHP и т. Д.) Используют вспомогательную DLL.

Как упоминал @patrick, SWIG использует P / Invoke, поэтому, если у вас возникла проблема с этим, вам нужно будет найти другое решение.

] Если вы используете типы, которые отличаются от обычных (пустоты, структуры и т. Д.), Вам придется проделать некоторую дополнительную работу, чтобы все получилось правильно, но для среднего API, использующего int, char * и т. Д., Это нормально.

14
ответ дан 30 November 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: