質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

ASPページでまれに実行時エラーが発生する

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,359

ladybird

score 161

質問内容

ASPページへのアクセス時、まれに下記のエラーが発生していて困っています。
主にクローラーからアクセスされた際に生じているようです。

間違っています、と言われてもどのパラメーターがどう間違っているのか、アクセスログやコードを追っても検討がつかず・・・
何か糸口があればご教示いただけますと幸いです。

エラーメッセージ

System.IO.IOException: パラメーターが間違っています

該当のソースコード

エラーが発生しているソース(ascx.vb)

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        Try
            '記事IDを取得する
            _strKijiId = _
                SanitizedRequest.QueryString(NCommon.CommonConst.QUERY_NAME_id) & ""
            If _strKijiId.Split("_").Length > 1 Then
                _strPageString = _strKijiId.Split("_")(1)
            End If

            Dim result As Integer
            If _strKijiId = String.Empty _
                OrElse _strKijiId.Split("_")(0).Length < 5 _
                OrElse Not Int32.TryParse(_strKijiId.Split("_")(0), result) _
                OrElse (Not _strPageString = String.Empty AndAlso Not Int32.TryParse(_strPageString, result)) Then

                Call RedirectErrorPage()
                Exit Sub
            End If

            '記事データの取得
            Call GetKijiData() 'エラーの発生箇所

            '(後続の処理は省略)

        Catch ex As Exception
            comWriteLog.WriteErrorLog(clsLog, clsError, ex, Server, Response, Request, System.Reflection.MethodBase.GetCurrentMethod())
        End Try
    End Sub

    Private Sub GetKijiData()
        Dim srFile As System.IO.StreamReader = Nothing
        Dim sr As System.IO.StringReader = Nothing

        Try
            Dim clsCache As New NCommon.comCache
            Dim strKeyName As String = GetCacheKey()
            Dim strKijiData As String = _
                    clsCache.getCacheItem(strKeyName)

            If strKijiData Is Nothing Then
                '記事のhtmlファイルが存在しない場合はerror.htmlに遷移
                Dim objFileInfo As New System.IO.FileInfo(GetKijiFilePath())
                If Not objFileInfo.Exists Then
                    Call RedirectErrorPage()
                    Exit Sub
                End If

                '記事ファイルを読み込む
                srFile = New System.IO.StreamReader(objFileInfo.FullName)
                strKijiData = srFile.ReadToEnd()

                '記事をキャッシュする
                Call clsCache.setCacheItem(strKeyName, strKijiData, CType(Application(NCommon.CommonConst.WEBCONFIG_CACHE_TIME), Integer))
            End If

            '記事ファイルを読み込む
            sr = New System.IO.StringReader(strKijiData)
            _pArticleHtml = sr.ReadToEnd()

        Catch ex As Exception
            Throw ex 'イベントログには発生箇所としてここの行数が記載される
        End Try

    End Sub

    Private Function GetCacheKey() As String
        If GetDeviceMode() = DeviceMode.PC Then
            Return NCommon.CommonConst.CACHE_NAME_SAFIX_PC & _strKijiId
        Else
            Return NCommon.CommonConst.CACHE_NAME_SAFIX_SP & _strKijiId
        End If
    End Function

    Private Function GetKijiFilePath() As String
        If GetDeviceMode() = DeviceMode.PC Then
            Return Application(NCommon.CommonConst.WEBCONFIG_KIJI_PC_HTML_PATH) & _strKijiId & NCommon.CommonConst.EXTENSION_HTML
        Else
            Return Application(NCommon.CommonConst.WEBCONFIG_KIJI_SP_HTML_PATH) & _strKijiId & NCommon.CommonConst.EXTENSION_HTML
        End If
    End Function


comCacheクラス

    Public Function getCacheItem(ByVal strKey As String) As Object

        Return HttpContext.Current.Cache.Get(strKey)

    End Function

    Public Sub setCacheItem(ByVal strKey As String, ByVal objData As Object, ByVal intSeconds As Int32, ByVal intSlidingSeconds As Int32)

        If (intSlidingSeconds > 0) Then
            HttpContext.Current.Cache.Insert(strKey, objData, Nothing, DateTime.Now.AddSeconds(intSlidingSeconds), Cache.NoSlidingExpiration)
        Else
            HttpContext.Current.Cache.Insert(strKey, objData, Nothing, DateTime.Now.AddSeconds(intSlidingSeconds), Cache.NoSlidingExpiration)
        End If

    End Sub

【2018/6/1追記】
長らく放置していてすみません。
スタックトレースを追えるようにコード変更して再現待ちしたところ、

srFile = New System.IO.StreamReader(objFileInfo.FullName)

の箇所でエラーになっていることが分かりました。
また、objFileInfo.FullNameには正常な値(業務上載せられないのですが、きちんと実物が存在するパス)が入っていました。
何か分かることがあればお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

直接の答えではありませんが、糸口をつかむための手段になるかもしれないということでレスします。

GetKijiData メソッドの以下のコードは何の意味があるのでしょう?

Catch ex As Exception
    Throw ex 'イベントログには発生箇所としてここの行数が記載される

補足した例外を catch ブロック内で再スローするとスタック情報が失われるのでデバッグできなくなると思うのですが。

catch ブロックは記述しないか、もし何らかの理由で例外を catch する必要があるなら、Throw ex としないで単に Throw とするのが正解です。

アップされているコードの例外処理も自分的にはピンときません。一度以下の記事を読むことをお勧めします。

.NETの例外処理 Part.1
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

Part.1 に書いてある集約的例外処理の詳細については以下の記事が参考になります。

How to: Handle Application-Level Errors
https://msdn.microsoft.com/en-us/library/24395wz3.aspx

Complete Example for Error Handlers
https://msdn.microsoft.com/en-us/library/bb397417.aspx

日本語版の方は、何かの手違いか、元の不完全なコード(Visual Studio 2008 の記事のコードと同じ)に戻ってしまったようですので参考になりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/23 16:14

    丁寧な回答ありがとうございます。
    なるほど、Throw ex としているから以前の情報が失われてしまっているのですね。

    引き継いだものなのでcatchしている意図は分かりかねますが、おそらく書かねばならないと思い込んでいただけかと・・・

    catchブロックを消すか、単に Throw にして再現待ちしてみます。

    キャンセル

0

Catch ex As Exception
 ★
 Throw ex 'イベントログには発生箇所としてここの行数が記載される
End Try


上記の★の部分でもログを出力すればエラーの出ている行が分かるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/23 16:16

    回答ありがとうございます。
    たしかにまずはエラーの情報を集めようとすべきでしたね。
    参考にさせていただきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる