Skip to content

Commit bb16aa7

Browse files
committed
Define package specific errors
1 parent 13d2255 commit bb16aa7

9 files changed

+85
-46
lines changed

pyppeteer/chromium_downloader.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def curret_platform() -> str:
4343
if sys.maxsize > 2 ** 31 - 1:
4444
return 'win64'
4545
return 'win32'
46-
raise Exception('Unsupported platform: ' + sys.platform)
46+
raise OSError('Unsupported platform: ' + sys.platform)
4747

4848

4949
def get_url() -> str:
@@ -66,7 +66,7 @@ def extract_zip(data: bytes, path: Path) -> None:
6666
f.extractall(str(path))
6767
exec_path = chromium_excutable()
6868
if not exec_path.exists():
69-
raise Exception('Failed to extract chromium.')
69+
raise IOError('Failed to extract chromium.')
7070
exec_path.chmod(exec_path.stat().st_mode | stat.S_IXOTH | stat.S_IXGRP |
7171
stat.S_IXUSR)
7272
logger.warn(f'chromium extracted to: {path}')

pyppeteer/connection.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
import asyncio
77
import json
88
import logging
9-
109
from typing import Awaitable, TYPE_CHECKING
1110

1211
from pyee import EventEmitter
1312
import websockets
1413

14+
from pyppeteer.errors import NetworkError
15+
1516
if TYPE_CHECKING:
1617
from typing import Callable, Dict, Optional # noqa: F401
1718

@@ -82,7 +83,7 @@ def _on_response(self, msg: dict) -> None:
8283
if 'error' in msg:
8384
error = msg['error']
8485
callback.set_exception(
85-
Exception(f'Protocol Error: {error}'))
86+
NetworkError(f'Protocol Error: {error}'))
8687
else:
8788
callback.set_result(msg.get('result'))
8889

@@ -167,7 +168,7 @@ async def send(self, method: str, params: dict = None) -> dict:
167168
callback.method: str = method # type: ignore
168169

169170
if not self._connection:
170-
raise Exception('Connection closed.')
171+
raise NetworkError('Connection closed.')
171172
await self._connection.send('Target.sendMessageToTarget', {
172173
'sessionId': self._sessionId,
173174
'message': msg,
@@ -184,7 +185,7 @@ def _on_message(self, msg: str) -> None:
184185
msg = error.get('message')
185186
data = error.get('data')
186187
callback.set_exception(
187-
Exception(f'Protocol Error: {msg} {data}')
188+
NetworkError(f'Protocol Error: {msg} {data}')
188189
)
189190
else:
190191
result = obj.get('result')

pyppeteer/element_handle.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from pyppeteer import helper
1111
from pyppeteer.connection import Session
12+
from pyppeteer.errors import ElementHandleError, BrowserError
1213
from pyppeteer.input import Mouse
1314

1415

@@ -33,7 +34,7 @@ async def dispose(self) -> None:
3334
async def evaluate(self, pageFunction: str, *args: Any) -> Any:
3435
"""Evaluate the pageFunction on browser."""
3536
if self._disposed:
36-
raise Exception('ElementHandle is disposed!')
37+
raise ElementHandleError('ElementHandle is disposed!')
3738
_args = ['this']
3839
_args.extend(json.dumps(x) for x in args)
3940
stringifiedArgs = ','.join(_args)
@@ -52,8 +53,10 @@ async def evaluate(self, pageFunction: str, *args: Any) -> Any:
5253
exceptionDetails = obj.get('exceptionDetails', dict())
5354
remoteObject = obj.get('result', dict())
5455
if exceptionDetails:
55-
raise Exception('Evaluation failed: ' +
56-
helper.getExceptionMessage(exceptionDetails))
56+
raise BrowserError(
57+
'Evaluation failed: ' +
58+
helper.getExceptionMessage(exceptionDetails)
59+
)
5760
return await helper.serializeRemoteObject(self._client, remoteObject)
5861

5962
async def _visibleCenter(self) -> Dict[str, int]:
@@ -71,7 +74,7 @@ async def _visibleCenter(self) -> Dict[str, int]:
7174
''') # noqa: E501
7275
if not center:
7376
# raise Exception('No node found for selector: ' + selector)
74-
raise Exception('No node found for selector: ')
77+
raise BrowserError('No node found for selector: ')
7578
return center
7679

7780
async def hover(self) -> None:

pyppeteer/errors.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
"""Exceptions for pyppeteer package."""
5+
6+
7+
class PyppeteerError(Exception): # noqa: D204
8+
"""Base exception for pyppeteer."""
9+
pass
10+
11+
12+
class BrowserError(PyppeteerError): # noqa: D204
13+
"""Exception raised from browser."""
14+
pass
15+
16+
17+
class ElementHandleError(PyppeteerError): # noqa: D204
18+
"""ElementHandle related exception."""
19+
pass
20+
21+
22+
class NetworkError(PyppeteerError): # noqa: D204
23+
"""Network/Protocol related exception."""
24+
pass
25+
26+
27+
class PageError(PyppeteerError): # noqa: D204
28+
"""Page/Frame related exception."""
29+
pass

pyppeteer/frame_manager.py

+13-11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from pyppeteer import helper
1313
from pyppeteer.connection import Session
14+
from pyppeteer.errors import BrowserError, NetworkError, PageError
1415
from pyppeteer.input import Mouse
1516
from pyppeteer.element_handle import ElementHandle
1617

@@ -71,7 +72,7 @@ def _onFrameNavigated(self, framePayload: dict) -> None:
7172
else:
7273
self._frames.get(framePayload.get('id', ''))
7374
if not (isMainFrame or frame):
74-
raise Exception('We either navigate top level or have old version '
75+
raise PageError('We either navigate top level or have old version '
7576
'of the navigated frame')
7677

7778
# Detach all child frames first.
@@ -180,10 +181,11 @@ async def _rawEvaluate(self, pageFunction: str, *args: str) -> dict:
180181
exceptionDetails = obj.get('exceptionDetails', dict())
181182
remoteObject = obj.get('result', dict())
182183
if exceptionDetails:
183-
raise Exception('Evaluation failed: ' +
184-
helper.getExceptionMessage(exceptionDetails) +
185-
f'\npageFunction:\n{pageFunction}'
186-
)
184+
raise BrowserError(
185+
'Evaluation failed: ' +
186+
helper.getExceptionMessage(exceptionDetails) +
187+
f'\npageFunction:\n{pageFunction}'
188+
)
187189
return remoteObject
188190

189191
@property
@@ -243,7 +245,7 @@ def waitFor(self, selectorOrFunctionOrTimeout: Union[str, int, float],
243245
return fut
244246
if not isinstance(selectorOrFunctionOrTimeout, str):
245247
fut = asyncio.get_event_loop().create_future()
246-
fut.set_exception(Exception(
248+
fut.set_exception(TypeError(
247249
'Unsupported target type: ' +
248250
str(type(selectorOrFunctionOrTimeout))
249251
))
@@ -303,7 +305,7 @@ def _navigated(self, framePayload: dict) -> None:
303305
def _detach(self) -> None:
304306
for waitTask in self._waitTasks:
305307
waitTask.terminate(
306-
Exception('waitForSelector failed: frame got detached.'))
308+
PageError('waitForSelector failed: frame got detached.'))
307309
self._detached = True
308310
if self._parentFrame:
309311
self._parentFrame._childFrames.remove(self)
@@ -319,13 +321,13 @@ def __init__(self, frame: Frame, predicateBody: str,
319321
super().__init__()
320322
if isinstance(polling, str):
321323
if polling not in ('raf', 'mutation'):
322-
raise Exception('Unknown polling option: ' + polling)
324+
raise ValueError('Unknown polling option: ' + polling)
323325
elif isinstance(polling, (int, float)):
324326
if polling <= 0:
325-
raise Exception(
327+
raise ValueError(
326328
f'Cannot poll with non-positive interval: {polling}')
327329
else:
328-
raise Exception('Unknown polling options: ' + str(polling))
330+
raise ValueError('Unknown polling options: ' + str(polling))
329331

330332
self._frame: Frame = frame
331333
self._pageScript: str = helper.evaluationString(
@@ -339,7 +341,7 @@ def __init__(self, frame: Frame, predicateBody: str,
339341
self._timeoutTimer = loop.call_later(
340342
timeout / 1000,
341343
lambda: self.terminate(
342-
Exception(f'waiting failed: timeout {timeout}ms exceeded')
344+
NetworkError(f'waiting failed: timeout {timeout}ms exceeded')
343345
)
344346
)
345347
asyncio.ensure_future(self.rerun())

pyppeteer/helper.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ async def serializeRemoteObject(client: Session, remoteObject: dict) -> Any:
6969
if unserializableValue in unserializableValueMap:
7070
return unserializableValueMap[unserializableValue]
7171
else:
72-
raise Exception(
72+
# BrowserError may be better
73+
raise ValueError(
7374
'Unsupported unserializable value: ' + str(unserializableValue)
7475
)
7576

pyppeteer/navigator_watcher.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from pyppeteer import helper
1212
from pyppeteer.connection import Session
13+
from pyppeteer.errors import NetworkError
1314

1415
if TYPE_CHECKING:
1516
from typing import Callable, List, Set # noqa: F401
@@ -31,7 +32,7 @@ def __init__(self, client: Session, ignoreHTTPSErrors: Any,
3132
self._idleInflight = options.get('networkIdleInflight', 2)
3233
self._waitUntil = options.get('waitUntil', 'load')
3334
if self._waitUntil not in ('load', 'networkidle'):
34-
raise Exception(
35+
raise ValueError(
3536
f'Unknown value for options.waitUntil: {self._waitUntil}')
3637

3738
def _raise_error(self, error: Exception = Exception()) -> None:
@@ -62,8 +63,8 @@ def watchdog_cb(fut: Awaitable) -> None:
6263
helper.addEventListener(
6364
self._client, 'Security.certificateError',
6465
lambda event: certificateError.set_exception(
65-
Exception('SSL Certificate error: ' +
66-
str(event.get('errorType')))
66+
NetworkError('SSL Certificate error: ' +
67+
str(event.get('errorType')))
6768
)
6869
)
6970
)

pyppeteer/network_manager.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from pyee import EventEmitter
1515

1616
from pyppeteer.connection import Session
17+
from pyppeteer.errors import NetworkError
1718
from pyppeteer.multimap import Multimap
1819

1920
if TYPE_CHECKING:
@@ -81,8 +82,8 @@ def _onRequestIntercepted(self, event: dict) -> None:
8182
if event.get('redirectStatusCode'):
8283
request = self._interceptionIdToRequest[event['interceptionId']]
8384
if not request:
84-
raise Exception('INTERNAL ERROR: failed to find request for '
85-
'interception redirect.')
85+
raise NetworkError('INTERNAL ERROR: failed to find request '
86+
'for interception redirect.')
8687
self._handleRequestRedirect(request,
8788
event['redirectStatusCode'],
8889
event['redirectHeaders'])

0 commit comments

Comments
 (0)