Haskell プログラムで使用している外部 dll があります。いくつかの特定のケースでは、dll がクラッシュします。
簡略化: まず、メソッド A にいくつかのパラメーターを指定して dll に送信し、次にメソッド B を呼び出してそれらのパラメーターに対していくつかの計算を行う必要があります。十分なパラメーターを指定しなかった場合、MethodB は dll 全体をクラッシュさせます。この場合、Haskell アプリケーションもクラッシュします。
これを処理する方法はありますか?残念ながら、dll からスローされる例外はありません。
ghci で次のメッセージが表示されます: InitNumericalSystem::initializeSystem でエラーが発生しました。ジャンクレーベル。
「catchAny を使用しようとしましたが、役に立ちませんでした。c_run は、4 つの入力パラメーターを受け取る外部 dll メソッドです。
catchAny :: IO a -> (SomeException -> IO a) -> IO a
catchAny = Control.Exception.catch
main :: IO ()
main = do
let timeTot = []::[CDouble]
timeNow = []::[CDouble]
runType = 2::CInt
timeTotPtr <- newArray timeTot
timeNowPtr <- newArray timeNow
result <- (catchAny $ c_run timeTotPtr runType timeNowPtr 0) $ \e -> do
putStrLn $ "Got an exception: " ++ show e
putStrLn "Returning dummy value of -1"
return (-1)
free timeTotPtr
free timeNowPtr
print result
編集: withAsync でも試してみましたが、運が悪くて tryAny :: IO a -> IO (Either SomeException a) tryAny action = withAsync action waitCatch
catchAny :: IO a -> (SomeException -> IO a) -> IO a
catchAny action onE = tryAny action >>= either onE return
try2 :: IO ()
try2 = do
let timeTot = []::[CDouble]
timeNow = []::[CDouble]
runType = 2::CInt
timeTotPtr <- newArray timeTot
timeNowPtr <- newArray timeNow
putStrLn $ "c_run going to call c_run.."
result <- catchAny (c_run timeTotPtr runType timeNowPtr 0) (const $ return (-1))
free timeTotPtr
free timeNowPtr
putStrLn $ "Result: " ++ show result